前回はプロセスを
教えてもらったね!
今回はそのプロセスの
管理方法を学んでいこう!
プロセスは
「シグナル(signal)」という
信号を送って管理するんだ
信号でプロセスに
「こうして欲しい」って
伝えるんだね
よく使うシグナルには
こんな種類があるよ
シグナル名 | シグナル番号 | 意味 |
---|---|---|
SIGTERM | 15 | 終了 |
SIGKILL | 9 | 強制終了 |
SIGHUP | 1 | 端末の接続切れを通知 |
SIGINT | 2 | キーボード割り込み(Ctrl + C) |
SIGQUIT | 3 | キーボード中止(Ctrl + /) |
SIGTSTP | 20 | 一時停止(Ctrl + Z) |
へぇ!
「Ctrl + C」って
実はシグナルを
送っていたんだ!
kill
コマンドkill
は
プロセスにシグナルを送信するよ
kill [オプション]... PID...
プロセスを止める用途がほとんどなのでこの名前なんだろうね確かに物騒な名前だけどただプロセスにシグナルを送信しているだけなんだ
では実際に
kill
を使ってみよう!まずは動いているプロセスを用意するよ以下のコマンドを実行しよう
sleep 1000 &
&
はバックグラウンドでコマンドで動かすんだよね実行したよ![1] 5717
ジョブ番号と…他に数字が出てきたね
この数字「5717」が プロセスの PID だよ
ps
で確認してみよう!ps
うん!
PID TTY TIME CMD
5173 09:28 pts/0 00:00:00 -bash
5717 13:00 pts/0 00:00:00 sleep
5720 13:02 pts/0 00:00:00 ps
確かに
sleep
のPID が 5717
だね!では
kill
を実行してsleep
プロセスに止まるようシグナルを送ろう!kill 5717
えいっ!
では終了したかどうか
ps
で確認してみようps
プロセスが止まるということはその表示が無くなるんだよね?
PID TTY TIME CMD
5173 09:28 pts/0 00:00:00 -bash
5723 13:05 pts/0 00:00:00 ps
sleep
が消えているねプロセスが終了したんだ!kill
で送信するシグナルは指定できるよ指定がなければシグナル指定方法 | kill コマンド |
---|---|
シグナル番号 | kill -9 5717 |
シグナル名 | kill -SIGKILL 5717 |
短縮シグナル名 | kill -KILL 5717 |
シグナル一覧の確認はどうするのかな?
kill
の -l
オプションで確認できるよ!kill -l
PID を扱うコマンドの多くはPID の代わりにジョブ番号を指定できるんだPID の代わりに
%ジョブ番号
と記述するだけだよへぇ…柔軟なんだね!
nohup
コマンドそういえば前回に出ていたプロセスの親子関係の話が出てこなかったね?
ちゃんと覚えていてくれたんだね
親プロセスを終了するとその子プロセスにSIGHUP が送られるんだだから親プロセスが終了すると子プロセスも一緒に終了しちゃうことが多いんだよ
基本的に親プロセスを止めれば子プロセスも止まってくれるんだね
複数のプロセスをまとめて止めたいときにこの親子関係が便利な場合があるんだ
でも…シェルから動かしたコマンドはそのシェルの子プロセスだよね?シェルが終わるとそれらのコマンドも一緒に終わっちゃわないかな?
基本的にはそうなるよリモート接続からコマンドを実行していたけど接続が切れるとコマンドが終わってしまうのはこういうわけなんだ
ネットワークが安定していないとコマンドがいつ終了しちゃうかヒヤヒヤするね…
そういうときに便利なのが
nohup
だよnohup
から実行されたコマンドはSIGHUP を受け取らなくなるんだnohup コマンド
リモート操作をするときは
nohup
があることを覚えておくね!今回はプロセスの管理方法を学んだよ!
kill
で暴走したプログラムを止めたりnohup
で長期間動かすタスクを安心して放置できるようにするんだねプロセス管理の知識はLinux を扱う上で重要だよ!