Linuxエンジニア養成講座 第12回|全36回・フェーズ2「Linux基礎」の9回目です。
前回までに学んだこと: ファイルのパーミッション(rwx)と所有権、chmod・chown・umask、特殊パーミッション(SUID/SGID/Sticky Bit)の概念(第11回)。
今回学ぶこと: プロセスとは何か、ps・top・killによるプロセスの確認と制御、ジョブ制御、ss・lsofによるポートとプロセスの紐付け。
この記事を読み終えると、以下のことができるようになります。
- プロセスとは何かを説明でき、
ps auxの出力から特定のプロセスの所有者・PID・状態を読み取れる topでリアルタイムにプロセスの負荷状況を確認できるkillコマンドでプロセスにシグナルを送れる。SIGTERM(15) と SIGKILL(9) の違いを説明できる- ジョブ制御(
&,jobs,fg,bg,Ctrl+Z)を使ってバックグラウンド/フォアグラウンドの切替ができる ss -tlnpでリッスンしているポートとプロセスの対応を確認できるsudo lsof -i :ポート番号で特定ポートを使っているプロセスを特定できる
alma-mainにSSH接続した状態で進めます。以降のコマンドはすべてalma-main上で実行します。
今回の後半で使う lsof コマンドは Minimal Install には含まれていません。先にインストールしておきます。第7回で dnf install を体験したのと同じ流れです。
実行コマンド:
$ sudo dnf install lsof
確認メッセージが表示されたら y を入力してインストールを完了させてください。
なぜプロセス管理を学ぶのか
前回の末尾で、「動いているプログラム(プロセス)を管理する方法を学ぶ」「プロセスにも所有者がいる」と予告しました。前回まではファイルという「静的なもの」を扱ってきましたが、今回からは「動いているもの」を扱います。
現場で「サーバーが重い」という連絡を受けたとき、最初にやることは「何のプロセスがCPUやメモリを消費しているか」の確認です。暴走しているプロセスを見つけて停止する。この一連の流れがプロセス管理の基本であり、障害対応の第一歩です。
前回学んだパーミッションの知識はここでも活きます。プロセスにも所有者がいて、そのプロセスがファイルにアクセスできるかどうかは、所有者のパーミッションで決まります。「サービスが動かない原因がパーミッション不足だった」というトラブルは現場で頻繁に発生します。
プロセスとは何か
プログラムとプロセスの違い
プログラムとプロセスは似た言葉ですが、意味が異なります。
- プログラム: ディスク上に保存された実行ファイル。例えば
/usr/sbin/sshdはSSHサーバーのプログラム - プロセス: プログラムがメモリに読み込まれ、CPUで実行されている状態
料理に例えると、プログラムは「レシピ(紙に書かれた手順)」、プロセスは「レシピに従って実際に調理している作業そのもの」です。1つのレシピから同時に複数の料理を作れるように、1つのプログラムから複数のプロセスが起動できます。
実際に確認してみます。SSHサーバー(sshd)のプロセスを見てみましょう。
実行コマンド:
$ ps aux | grep sshd
実行結果:
root 802 0.0 0.2 17472 9856 ? Ss 3月28 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 12849 0.0 0.3 20868 12288 ? Ss 21:09 0:00 sshd: developer [priv]
develop+ 12852 0.0 0.1 21076 7460 ? S 21:09 0:00 sshd: developer@notty
develop+ 12853 0.0 0.0 5428 3584 ? Ss 21:09 0:00 bash -c ps aux | grep sshd
develop+ 12873 0.0 0.0 4592 2304 ? S 21:09 0:00 grep sshd
/usr/sbin/sshd という1つのプログラムから、複数のプロセスが動いています。PID 802 が接続を待ち受ける親プロセス、PID 12849 と PID 12852 が現在のSSHセッション用のプロセスです。このように、1つのプログラムから複数のプロセスが生まれることを覚えておいてください。第8回で学んだパイプを使って ps aux | grep sshd と絞り込んでいます。
PID と所有者
すべてのプロセスには、PID(Process ID)という一意の番号が割り当てられます。プロセスを操作するときは、この PID を使って対象を指定します。
プロセスには親子関係もあります。あるプロセスが別のプロセスを生み出した場合、生み出した側が「親プロセス」、生まれた側が「子プロセス」です。親プロセスのPIDはPPID(Parent PID)と呼ばれます。
実行コマンド:
$ ps -ef | grep -E '(sshd|cron)' | grep -v grep
実行結果:
root 802 1 0 08:48 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 808 1 0 08:48 ? 00:00:00 /usr/sbin/crond -n
root 1177 802 1 08:58 ? 00:00:00 sshd: developer [priv]
develop+ 1180 1177 0 08:58 ? 00:00:00 sshd: developer@notty
PPID 列(3列目)に注目してください。sshd(PID 802)も crond(PID 808)も、PPID が 1 です。PID 1 は systemd というプロセスで、Linux起動時に最初に立ち上がるプロセスです。つまり sshd や crond は systemd が起動・管理しているプロセスということになります。この仕組みは次回の第13回「systemd」で詳しく扱います。3行目と4行目はSSHセッション用のsshd子プロセスです。PPID が 802(sshdの親プロセス)になっている点に注目してください。
プロセスの所有者は、そのプロセスを起動したユーザーです。先ほどの ps aux | grep sshd の出力で、PID 802 の所有者は root、PID 12852 の所有者は developer でした。第10回で学んだユーザーの仕組みと、第11回で学んだパーミッションが、ここでつながります。プロセスがファイルにアクセスできるかどうかは、そのプロセスの所有者のパーミッションで決まります。
ps — プロセスの一覧を確認する
ps(process status)は、現在動いているプロセスの一覧を表示するコマンドです。プロセス管理で最も頻繁に使います。
ps aux の読み方
実行コマンド:
$ ps aux | head -15
実行結果:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.4 108604 16464 ? Ss 08:48 0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 31
root 2 0.0 0.0 0 0 ? S 08:48 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:48 0:00 [pool_workqueue_]
root 4 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/R-rcu_g]
root 5 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/R-sync_]
root 6 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/R-slub_]
root 7 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/R-netns]
root 9 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/0:0H-events_highpri]
root 10 0.0 0.0 0 0 ? I 08:48 0:00 [kworker/u8:0-writeback]
root 11 0.0 0.0 0 0 ? I< 08:48 0:00 [kworker/R-mm_pe]
root 12 0.0 0.0 0 0 ? I 08:48 0:00 [kworker/u8:1-writeback]
root 13 0.0 0.0 0 0 ? I 08:48 0:00 [rcu_tasks_kthre]
root 14 0.0 0.0 0 0 ? I 08:48 0:00 [rcu_tasks_rude_]
root 15 0.0 0.0 0 0 ? I 08:48 0:00 [rcu_tasks_trace]
ps aux のオプションの意味は、a=全ユーザーのプロセス、u=詳細表示、x=端末に紐付かないプロセスも表示、です。各列の意味を確認します。
- USER: プロセスの所有者
- PID: プロセスID(一意の番号)
- %CPU: CPU使用率
- %MEM: メモリ使用率
- STAT: プロセスの状態。S=スリープ(待機中)、R=実行中、T=停止、Z=ゾンビ(終了したが親が回収していない)
- COMMAND: 実行中のコマンド名
PID 1 が /usr/lib/systemd/systemd であることを確認してください。これがLinuxの全プロセスの起点です。角括弧で囲まれた名前([kthreadd] 等)はカーネルスレッドと呼ばれるOS内部の処理で、通常は操作の対象になりません。
grep との組み合わせ
ps aux は全プロセスを表示するため、出力が長くなります。特定のプロセスを探すには、第8回で学んだパイプと grep を組み合わせます。
実行コマンド:
$ ps aux | grep sshd
先ほどの出力をもう一度見てください。最後の行に grep sshd が含まれています。grep コマンド自身もプロセスとして動くため、検索結果に自分自身が表示されてしまいます。これを避けるには pgrep を使います。
実行コマンド:
$ pgrep -a sshd
実行結果:
802 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
12975 sshd: developer [priv]
12978 sshd: developer@notty
pgrep はプロセス名で検索する専用コマンドです。-a オプションでコマンド全体を表示します。grep のように自分自身が結果に混じることはありません。
top -- リアルタイムで監視する
ps はコマンドを実行した瞬間のスナップショットです。「サーバーが重い」という場面では、リアルタイムで変化する状況を監視したくなります。そのためのコマンドが top です。
実行コマンド:
$ top -bn1 | head -15
実行結果:
top - 08:59:02 up 10 min, 0 users, load average: 0.00, 0.00, 0.00
Tasks: 126 total, 2 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3911.1 total, 3337.4 free, 522.8 used, 276.7 buff/cache
MiB Swap: 4040.0 total, 4040.0 free, 0.0 used. 3388.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 108604 16464 11008 S 0.0 0.4 0:00.67 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pool_wo+
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
ここでは -bn1 オプション(バッチモードで1回だけ表示)を使って結果を出力しています。実際の運用では top とだけ入力して対話モードで使うのが一般的です。ヘッダー部分の読み方を確認します。
- load average: CPU負荷の目安。左から1分・5分・15分の平均。CPUコア数を超えると「負荷が高い」状態(この環境は2コアなので、2.0を超えると要注意)
- Tasks: プロセスの総数と状態別の内訳。zombie が 0 でない場合は注意が必要
- %Cpu(s): CPU使用率の内訳。id(idle)が100%に近ければCPUは余裕がある。wa(I/O wait)が高いとディスクがボトルネック
- MiB Mem / MiB Swap: メモリとスワップの使用状況。Swapが大量に使われていたらメモリ不足のサイン
対話モードでの基本操作は以下のとおりです。
q: top を終了するP(大文字): CPU使用率の高い順にソートM(大文字): メモリ使用率の高い順にソートk: 指定したPIDのプロセスにシグナルを送る(次のセクションで学ぶ kill と同じ動作)
まずは「top を起動して画面を読み、q で抜ける」ができれば十分です。
kill -- プロセスを終了する
プロセスを確認する方法を学んだので、次はプロセスを終了する方法です。kill コマンドは、名前のとおりプロセスを「終了させる」ために使います。正確には、プロセスに「シグナル」と呼ばれる信号を送るコマンドです。
シグナルの種類は多いですが、現時点で覚えるべきものは3つだけです。
- SIGTERM(15): 「終了してください」というお願い。デフォルトのシグナル
- SIGKILL(9): 「今すぐ停止しろ」という強制命令
- SIGHUP(1): 「設定を再読み込みしてください」という通知。デーモンの設定変更時に使う(第13回で実践)
SIGTERM と SIGKILL
この2つの違いは、プロセスの終了手順で決まります。
SIGTERM(15)-- デフォルト
- プロセスに「終了してください」と伝える
- プロセスは一時ファイルの削除、ログの書き出し、接続の切断といった後片付けをしてから終了できる
kill PIDと打つと、この SIGTERM が送られる
SIGKILL(9)-- 強制終了
- プロセスを即座に強制終了する
- 後片付けの時間は与えられない。書き込み途中のデータが破損する恐れがある
kill -9 PIDで送る
プロセスを終了するときの鉄則は「まず SIGTERM、ダメなら SIGKILL」です。kill -9 は最後の手段として覚えてください。
killall と pkill
PIDを指定する kill の他に、プロセス名で終了させるコマンドもあります。
killall プロセス名: 指定した名前のプロセスをすべて終了するpkill プロセス名: パターンマッチで一致するプロセスを終了する
便利なコマンドですが、本番サーバーで安易に使うと意図しないプロセスまで巻き込む危険があります。PID を指定する kill のほうが安全です。本番環境では ps aux | grep プロセス名 で対象を確認してから kill PID で終了する手順を習慣にしてください。
ジョブ制御 -- バックグラウンドとフォアグラウンド
ターミナルでコマンドを実行すると、通常はそのコマンドが完了するまで次のコマンドを入力できません。この状態を「フォアグラウンド実行」と言います。一方、コマンドの末尾に & を付けると、裏側で実行しつつターミナルを使い続けることができます。これが「バックグラウンド実行」です。
現場では、時間のかかる処理(ログの集計、大量ファイルのコピー等)をバックグラウンドで動かしながら、別の作業を並行することがよくあります。
ジョブ制御の基本操作は以下のとおりです。
コマンド &: バックグラウンドで実行を開始するCtrl+Z: フォアグラウンドのプロセスを一時停止する(終了ではない)jobs: 現在のジョブ一覧を表示するfg %ジョブ番号: バックグラウンドまたは停止中のジョブをフォアグラウンドに戻すbg %ジョブ番号: 停止中のジョブをバックグラウンドで再開する
状態の遷移をまとめると、次のようになります。
フォアグラウンド(実行中)
│ Ctrl+Z
▼
停止中(Stopped)
│ bg %番号 │ fg %番号
▼ ▼
バックグラウンド(実行中)──→ フォアグラウンド(実行中)
fg %番号
第5回のヒヤリハットで、SSH接続が切れるとフォアグラウンドのプロセスも停止することを紹介しました。ジョブ制御はそのSSHセッション内でのみ有効です。SSHを切断してもバックグラウンドで動かし続けたい場合は、nohup や tmux を使います。これらは第27回「SSH応用」で扱います。
ss と lsof -- プロセスとポートの紐付け
サーバー上で動いているプロセスの多くは、ネットワーク経由でアクセスを受け付けています。その受け付け口が「ポート」です。SSHは22番ポート、Webサーバーは80番ポートといった具合です。ポートの詳しい仕組みは第16回「ネットワーク基礎」で扱います。今は「プロセスがポート番号を使ってネットワーク通信をする」ということだけ覚えておいてください。
ここでは「どのプロセスがどのポートを使っているか」を確認する方法を紹介します。
実行コマンド:
$ sudo ss -tlnp
実行結果:
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=802,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=802,fd=4))
ss のオプションは、-t=TCP、-l=LISTEN状態(待ち受け中)、-n=ポート番号を数値で表示、-p=プロセス情報を表示、です。Minimal Install 直後の環境なので、リッスンしているのは sshd(ポート22)のみです。Process 列に pid=802 とあり、先ほど ps aux で確認した sshd のPIDと一致しています。
sudo を付けないと Process 列が空になります。プロセス情報の表示には管理者権限が必要です。
次に lsof で特定のポートを使っているプロセスを確認します。
実行コマンド:
$ sudo lsof -i :22 -n
実行結果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 802 root 3u IPv4 21927 0t0 TCP *:ssh (LISTEN)
sshd 802 root 4u IPv6 21929 0t0 TCP *:ssh (LISTEN)
sshd 1253 root 4u IPv4 25407 0t0 TCP 192.168.1.121:ssh->192.168.1.100:57734 (ESTABLISHED)
sshd 1256 developer 4u IPv4 25407 0t0 TCP 192.168.1.121:ssh->192.168.1.100:57734 (ESTABLISHED)
lsof -i :22 -n は「ポート22を使っているプロセスを表示する」という意味です。-n はホスト名の逆引きを抑制し、IPアドレスのまま表示するオプションです。LISTEN 状態の行が待ち受け中のsshd、ESTABLISHED 状態の行が現在接続中のSSHセッションです。COMMAND、PID、USER の列は ps aux の出力と対応しています。
ss はポート一覧をざっと見るとき、lsof は特定ポートを使っているプロセスを詳しく調べるときに使い分けます。現場で「ポート22に接続できない」といったトラブルが起きたら、まず ss -tlnp でポートがリッスン状態かを確認し、lsof -i :22 でプロセスの状態を調べるという流れになります。
やってみよう -- プロセスを操作する
ここまで学んだ内容を、手を動かして確認します。
ステップ1: プロセスの確認
実行コマンド:
$ ps aux | head -15
出力の1行目がヘッダーです。USER、PID、%CPU、%MEM、STAT、COMMAND の各列を確認してください。PID 1 が systemd であることも確認します。
実行コマンド:
$ ps aux | grep sshd
USER 列に注目してください。sshd のリスナーは root が所有者です。前回学んだパーミッションの知識を使えば、「root が所有するプロセスは root の権限でファイルにアクセスする」と理解できます。
ステップ2: top で負荷を確認する
実行コマンド:
$ top
画面が更新され続けます。1行目の load average、2行目の Tasks、3行目の %Cpu(s)、4行目の MiB Mem を確認してください。確認が終わったら q キーで終了します。
ステップ3: プロセスを起動して終了する(SIGTERM)
実行コマンド:
$ sleep 300 &
[1] 12345 のような表示が出ます。[1] がジョブ番号、12345 がPIDです(数値は実行ごとに変わります)。表示されたPIDを控えておいてください。
実行コマンド:
$ ps aux | grep sleep
sleep プロセスが動いていることを確認できます。では SIGTERM で終了させます。以下のコマンドの PID は、先ほど控えた数値に置き換えてください。
実行コマンド:
$ kill PID
もう一度 ps aux | grep sleep を実行すると、sleep プロセスがなくなっているはずです。これが SIGTERM による正常終了です。
ステップ4: SIGKILL で強制終了する
実行コマンド:
$ sleep 300 &
再びPIDを控えてから、今度は kill -9 で強制終了します。
実行コマンド:
$ kill -9 PID
sleep のような単純なコマンドでは SIGTERM と SIGKILL の結果に違いは見えません。しかしデータベースのようにファイルへの書き込みを行うプロセスでは、SIGKILL によって書き込み途中のデータが破損する危険があります。
ステップ5: ジョブ制御を体験する
実行コマンド:
$ sleep 300
ターミナルが止まり、次のコマンドを入力できなくなります。これがフォアグラウンド実行です。ここで Ctrl+Z を押してください。
[1]+ Stopped sleep 300 と表示され、プロセスが一時停止します。
実行コマンド:
$ jobs
[1]+ Stopped sleep 300 と表示されます。ジョブ番号1が停止中です。
実行コマンド:
$ bg %1
停止中のジョブがバックグラウンドで再開されます。jobs を実行すると Running に変わっていることを確認できます。
実行コマンド:
$ fg %1
バックグラウンドで動いていたジョブがフォアグラウンドに戻ります。再びターミナルが止まるので、Ctrl+C で終了してください。Ctrl+C は SIGINT(割り込み)シグナルを送り、プロセスを終了させます。
ステップ6: ポートとプロセスの紐付けを確認する
実行コマンド:
$ sudo ss -tlnp
sshd がポート22でリッスンしていることを確認します。Process 列の pid=802 を確認してください。
実行コマンド:
$ sudo lsof -i :22 -n
ss の pid=802 と lsof の PID 802 が一致しています。同じ sshd プロセスがポート22を使ってSSH接続を待ち受けていることが、2つのコマンドから裏付けられました。
やらかし体験: 自分のシェルを kill してみる
自分が今使っているシェルのPIDを確認します。
実行コマンド:
$ echo $$
表示された数値が、今のシェルのPIDです。このPIDに対して kill を実行してみます。
実行コマンド:
$ kill $$
SSHセッションが切断されます。自分のシェルを終了させたため、SSH接続が閉じられました。再度SSHで接続し直してください。本番サーバーで重要なプロセスを誤って kill すると、このようにサービスが停止します。だからこそ kill を実行する前に、対象のPIDが正しいか必ず確認する習慣が必要です。
クリーンアップ
バックグラウンドで動いているジョブが残っていないか確認します。
実行コマンド:
$ jobs
何も表示されなければ、残っているジョブはありません。もしジョブが残っている場合は kill %ジョブ番号 で終了させてください。
現場のヒヤリハット -- 本番サーバーで kill -9 した話
ある新人エンジニアが、データベースのプロセスが応答しなくなったため、焦って kill -9 を実行しました。データベースはトランザクション(書き込み処理のまとまり)を途中で強制終了されたため、データファイルが破損しました。復旧に半日かかり、その間サービスは停止したままでした。
正しい対処は以下の順序です。
- まず
kill PID(SIGTERM)で正常終了を試みる - 数十秒待っても終了しなければ、
kill -9 PID(SIGKILL)を検討する - 本番サーバーでプロセスを止めるときは、実行前に上司や先輩に一声かける
第2回で学んだ「報連相」が活きる場面です。「kill -9 は最後の手段」を鉄則として覚えてください。
自走のヒント
man ps で ps のオプション一覧を確認できます。man kill でシグナルの一覧と用法を調べられます。ps --help all で簡易ヘルプも表示されます。今回紹介した ps aux、top、kill の3つを覚えておけば、プロセスの確認と終了で困ることはありません。細かいオプションは必要になったときに man で調べれば十分です。
理解度チェック
以下の文が正しければ○、間違っていれば×と答えてください。
- プログラムとプロセスは同じものである
ps auxの USER 列は、そのプロセスを実行しているユーザーを示すkillコマンドのデフォルトシグナルは SIGKILL(9) である- SIGKILL(9) を受けたプロセスは、後片付け処理を行ってから終了する
- コマンドの末尾に
&を付けるとバックグラウンドで実行される Ctrl+Zはプロセスを終了させる操作であるss -tlnpでリッスンしているTCPポートとプロセスの対応を確認できる- プロセスの所有者がファイルにアクセスできるかどうかは、前回学んだパーミッションで決まる
解答
- × ―― プログラムはディスク上の実行ファイル、プロセスはメモリ上で実行中の状態。1つのプログラムから複数のプロセスが起動できる
- ○ ―― USER 列はそのプロセスの所有者(実行ユーザー)を表す
- × ―― デフォルトは SIGTERM(15)。SIGKILL(9) は
kill -9と明示的に指定したときに送られる - × ―― SIGKILL は即座に強制終了する。後片付け処理を行う時間は与えられない
- ○ ――
&を付けるとバックグラウンドで実行され、ターミナルを占有しない - × ――
Ctrl+Zはプロセスを一時停止(SIGTSTP)する操作。終了はCtrl+C(SIGINT) - ○ ――
-t=TCP、-l=LISTEN、-n=数値表示、-p=プロセス情報で確認できる - ○ ―― プロセスがファイルにアクセスする際、所有者のパーミッションが適用される
まとめ
今回はLinuxのプロセス管理を学びました。
- プログラムはディスク上のファイル、プロセスはメモリ上で実行中の状態。1つのプログラムから複数のプロセスが起動できる
- すべてのプロセスにはPID(プロセスID)が割り当てられ、親子関係(PPID)を持つ
ps auxでプロセスの一覧を確認する。grep やpgrep と組み合わせて特定のプロセスを探すtopでリアルタイムにCPU・メモリの負荷を監視するkill PIDで SIGTERM(正常終了)、kill -9 PIDで SIGKILL(強制終了)。まず SIGTERM を試し、SIGKILL は最後の手段&、Ctrl+Z、jobs、fg、bgでフォアグラウンドとバックグラウンドを切り替えられるss -tlnpでリッスンポートを一覧し、lsof -i :ポート番号で特定ポートのプロセスを調べる
今回は手動でプロセスを確認・起動・終了する方法を学びました。しかし本番サーバーでは、OS起動時にプロセスを自動で開始させ、異常終了時には自動で再起動させる仕組みが必要です。ps aux の出力で PID 1 として表示された systemd が、その仕組みの中核です。今回 ps -ef で確認した sshd や crond は、PPID が 1(systemd)でした。つまりこれらは systemd が管理する「サービス」として動いています。
次回の第13回「systemd」では、systemctl コマンドでサービスを管理する方法を学びます。
シリーズ一覧
フェーズ1: エンジニアのいろは(第1回〜第3回)
フェーズ2: Linux基礎(第4回〜第15回)
- 第4回 Linuxとは何か+環境確認
- 第5回 SSH接続とターミナル操作
- 第6回 ファイルシステムとディレクトリ構造
- 第7回 基本コマンド(ファイル操作)
- 第8回 基本コマンド(テキスト処理・パイプとリダイレクト)
- 第9回 viエディタ
- 第10回 ユーザーとグループ管理
- 第11回 パーミッションと所有権
- 第12回 プロセス管理(この記事)
- 第13回 systemd
- 第14回 シェルスクリプト入門
- 第15回 フェーズ2まとめ演習
フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)
- 第16回 ネットワーク基礎
- 第17回 ネットワーク設定と疎通確認
- 第18回 企業ネットワークの仕組み
- 第19回 パッケージ管理
- 第20回 ファイアウォール(firewalld)
- 第21回 ボンディング/チーミング
- 第22回 VLAN
- 第23回 ログ管理
- 第24回 cron / systemd timer
- 第25回 ストレージ管理(LVM)
- 第26回 シェルスクリプト実践
- 第27回 SSH応用
フェーズ4: サーバー構築と運用(第28回〜第36回)
