LinuxServer プロセス管理について
プロセスとはOSが管理するプログラムの基本単位です。
プログラムを実行するとプロセスが生成され、メモリが割り当てられます。
プロセスは個別のプロセスIDを持ちます。プロセスIDは起動順に割り当てられ、
システム起動時に起動されるinitプログラムのPIDは常に1になります。
プロセスが別のプロセスを起動するとき、プロセス間は親子関係を持ちます。
起動元を親プロセス、起動先を子プロセスと言います。
プロセスの監視
プロセスの生存期間はサーバプログラムのように長時間稼働しているものや、コマンドのように一瞬で終了するものもあります。
現在実行されているプロセスを表示するにはpsコマンドを使用します。
[コマンド書式]
ps -オプション
psコマンドの主なオプションは次のとおりです。
オプション | 説明 |
---|---|
a | 他のユーザのプロセスも表示します |
f | 親子関係をツリー上に表示します |
u | ユーザ名も表示します |
x | 制御端末のないデーモンなどのプロセスも表示します |
-e | 全てのプロセスを表示します |
-l | 詳細な情報を表示します |
-p プロセスID | 指定したプロセスIDのプロセス情報のみを表示します |
-C プロセス名 | 指定したプロセス名のプロセス情報のみを表示します |
-w | 長い行は折り返して表示します |
psコマンドのオプションには「-」を付けるものと付けないものがあります。
他のUNIX系OSとの関係で、オプションによっては「-」の有無で動作が異なります。
Linuxでは「-」を付けずにオプションを利用することが推奨されています。
「-」を付けないオプションに「-」を付けて実行すると次のようなメッセージが表示されます。
「Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ」
[コマンド実行例]オプションを付けずに実行するとユーザ自身が起動したプロセスが表示されます。
$ ps
PID TTY TIME CMD
5916 pts/0 00:00:00 bash
6155 pts/0 00:00:00 ps
システム上で実行中のすべてのプロセスを表示するにはaxオプションか-eオプションを使用します。
$ ps -e | head -5
PID TTY TIME CMD
1 ? 00:01:02 systemd
2 ? 00:00:02 kthreadd
3 ? 00:00:02 ksoftirqd/0
5 ? 00:00:00 kworker/u:0
$ ps ax | head -5
PID TTY STAT TIME COMMAND
1 ? Ss 1:02 /usr/lib/systemd/systemd –system –deserialize 21
2 ? S 0:02 [kthreadd]
3 ? S 0:02 [ksoftirqd/0]
5 ? S 0:00 [kworker/u:0]
実行中のプロセスは独立して動作しますが、あるプロセスが他のプロセスを起動することがあり、
元のプロセスのことを親プロセス、親プロセスから起動されたプロセスを子プロセスと呼びます。
プロセスの親子関係を含めてプロセスを階層構造で表示できるのがpstreeコマンドです。
[コマンド書式]
pstree -オプション
pstreeコマンドはinitプロセスを親として出力します。
システムの状況をリアルタイムで継続的に表示するにはtopコマンドを使用します。
topコマンドを実行すると画面が切り替わり、システム概要(CPUやメモリの使用状況などの統計情報)と
実行中のプロセス一覧をデフォルト3秒毎に更新しながら表示します。
top – 11:48:49 up 93 days, 13:20, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 107 total, 1 running, 106 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
Mem: 1019748k total, 907560k used, 112188k free, 62284k buffers
Swap: 2064380k total, 89592k used, 1974788k free, 556372k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 45812 1548 812 S 0.0 0.2 1:02.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:02.03 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:02.58 ksoftirqd/0
5 root 20 0 0 0 0 S 0.0 0.0 0:00.93 kworker/u:0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
-dオプションを使用すると表示を更新する間隔を秒単位で指定できます。
topコマンドを終了するにはQキーを押します。
プロセスの終了
プロセスを終了させるにはkillコマンドを使用します。
killコマンドはPIDを指定してプロセスに対してシグナルを送ります。
プロセスは受け取ったシグナルに応じ、終了や再起動などの動作を実行します。
[コマンド書式]
kill -シグナル名/-シグナル番号 プロセスID
kill -s シグナル名またはシグナル番号 プロセスID
kill -SIGシグナル名 プロセスID
シグナルを省略すると、TERMシグナルが送られます。
シグナルは次に上げる主なシグナル以外にもあり、システムで利用できるシグナルは
kill -lコマンドで確認することができます。
シグナル名 | シグナルID | 説明 |
---|---|---|
HUP | 1 | ハングアップ(再起動)させます |
INT | 2 | 割り込みによって終了します Ctrl+Cを押すことでも送られます |
KILL | 9 | 強制終了させます |
TERM | 15 | 通常終了させます |
CONT | 18 | 一時停止しているプロセスを再開させます |
STOP | 19 | 一時停止させます |
TERMシグナルで終了しないプロセスはプログラムが異常動作している場合があり、
そのような時はKILLシグナルを用いて強制終了させます。
強制終了した場合、アクセス中のファイルが壊れる等の障害が発生する可能性があります。
また、ほとんどの場合、親プロセスを終了させると子プロセスも終了します。
killコマンドでは終了させるプロセスのプロセスIDを指定していましたが、プロセス名を
指定することで実行中のプロセスを停止するkillallコマンドがあります。
killallコマンドのオプションはkillコマンドと同じになります。