本記事には広告(アフィリエイトリンク)が含まれます。

Linuxプロセス管理入門 ps・top・kill解説

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を切断してもバックグラウンドで動かし続けたい場合は、nohuptmux を使います。これらは第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 を実行しました。データベースはトランザクション(書き込み処理のまとまり)を途中で強制終了されたため、データファイルが破損しました。復旧に半日かかり、その間サービスは停止したままでした。

正しい対処は以下の順序です。

  1. まず kill PID(SIGTERM)で正常終了を試みる
  2. 数十秒待っても終了しなければ、kill -9 PID(SIGKILL)を検討する
  3. 本番サーバーでプロセスを止めるときは、実行前に上司や先輩に一声かける

第2回で学んだ「報連相」が活きる場面です。「kill -9 は最後の手段」を鉄則として覚えてください。

自走のヒント

man ps で ps のオプション一覧を確認できます。man kill でシグナルの一覧と用法を調べられます。ps --help all で簡易ヘルプも表示されます。今回紹介した ps auxtopkill の3つを覚えておけば、プロセスの確認と終了で困ることはありません。細かいオプションは必要になったときに man で調べれば十分です。

理解度チェック

以下の文が正しければ○、間違っていれば×と答えてください。

  1. プログラムとプロセスは同じものである
  2. ps aux の USER 列は、そのプロセスを実行しているユーザーを示す
  3. kill コマンドのデフォルトシグナルは SIGKILL(9) である
  4. SIGKILL(9) を受けたプロセスは、後片付け処理を行ってから終了する
  5. コマンドの末尾に & を付けるとバックグラウンドで実行される
  6. Ctrl+Z はプロセスを終了させる操作である
  7. ss -tlnp でリッスンしているTCPポートとプロセスの対応を確認できる
  8. プロセスの所有者がファイルにアクセスできるかどうかは、前回学んだパーミッションで決まる

解答

  1. × ―― プログラムはディスク上の実行ファイル、プロセスはメモリ上で実行中の状態。1つのプログラムから複数のプロセスが起動できる
  2. ○ ―― USER 列はそのプロセスの所有者(実行ユーザー)を表す
  3. × ―― デフォルトは SIGTERM(15)。SIGKILL(9) は kill -9 と明示的に指定したときに送られる
  4. × ―― SIGKILL は即座に強制終了する。後片付け処理を行う時間は与えられない
  5. ○ ―― & を付けるとバックグラウンドで実行され、ターミナルを占有しない
  6. × ―― Ctrl+Z はプロセスを一時停止(SIGTSTP)する操作。終了は Ctrl+C(SIGINT)
  7. ○ ―― -t=TCP、-l=LISTEN、-n=数値表示、-p=プロセス情報で確認できる
  8. ○ ―― プロセスがファイルにアクセスする際、所有者のパーミッションが適用される

まとめ

今回はLinuxのプロセス管理を学びました。

  • プログラムはディスク上のファイル、プロセスはメモリ上で実行中の状態。1つのプログラムから複数のプロセスが起動できる
  • すべてのプロセスにはPID(プロセスID)が割り当てられ、親子関係(PPID)を持つ
  • ps aux でプロセスの一覧を確認する。grep やpgrep と組み合わせて特定のプロセスを探す
  • top でリアルタイムにCPU・メモリの負荷を監視する
  • kill PID で SIGTERM(正常終了)、kill -9 PID で SIGKILL(強制終了)。まず SIGTERM を試し、SIGKILL は最後の手段
  • &Ctrl+Zjobsfgbg でフォアグラウンドとバックグラウンドを切り替えられる
  • 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回)

フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)

フェーズ4: サーバー構築と運用(第28回〜第36回)