シグナルを用いたプロセス制御手法
Linuxシステムでは、kill、killall、pkillといったコマンドを用いてプロセスにシグナルを送信できます。各コマンドの特徴は以下の通りです。
- kill: プロセスID(PID)を指定してシグナルを送信
- killall: プロセス名を指定してシグナルを送信
- pkill: 端末(tty)やユーザーを指定してプロセスを操作
使用例:
pkill -t pts/2 # pts/2の全プロセスを停止
pkill -9 -t pts/2 # pts/2の全プロセスを強制終了
pkill -u test01 # test01ユーザーの全プロセスに終了シグナル
pkill -19 -u test01 # test01ユーザーの全プロセスを停止
主要なシグナル一覧
kill -lで利用可能な全シグナルを確認できます。以下は頻出するシグナルです。
| 番号 | 名称 | 動作 |
|---|---|---|
| 1 | SIGHUP | 設定再読込(プロセス再起動) |
| 2 | SIGINT | キーボード割込み(Ctrl+C相当) |
| 3 | SIGQUIT | キーボード終了 |
| 9 | SIGKILL | 強制終了(捕捉不可) |
| 15 | SIGTERM | 正常終了(デフォルト) |
| 18 | SIGCONT | 停止からの再開 |
| 19 | SIGSTOP | プロセス停止(捕捉不可) |
| 20 | SIGTSTP | 一時停止(Ctrl+Z相当) |
実践例: Nginx設定再読込
SIGHUPシグナル(1)を送信すると、マスタープロセスは設定を再読込し、新しいワーカープロセスを生成します。
[root@ds2 ~]# ps -ef | grep nginx
root 27618 1 0 18:16 ? 00:00:00 nginx: master process ...
nginx 27619 27618 0 18:16 ? 00:00:00 nginx: worker process
[root@ds2 ~]# kill -1 27618 # 設定再読込
[root@ds2 ~]# ps -ef | grep nginx
root 27618 1 0 18:16 ? 00:00:00 nginx: master process ... # PID不変
nginx 27755 27618 0 19:27 ? 00:00:00 nginx: worker process # 新しいワーカー
実践例: crondへのシグナル送信
PIDを指定して、SIGHUP(1)で設定再読込、SIGTERM(15)で正常終了を試みます。
[yang@host ~]$ ps aux | grep crond
root 478 0.0 0.1 124144 1572 ? Ss 09:35 0:00 /usr/sbin/crond -n
[yang@host ~]$ sudo kill -1 478 # 設定再読込
[yang@host ~]$ ps aux | grep crond
root 478 0.0 0.1 124144 1572 ? Ss 09:35 0:00 /usr/sbin/crond -n # 継続
[yang@host ~]$ sudo kill 478 # SIGTERM送信
[yang@host ~]$ ps aux | grep crond # プロセス消滅
[yang@host ~]$ sudo systemctl start crond # 再起動
実践例: SIGSTOPとSIGCONTの動作検証
シグナル19(SIGSTOP)でプロセスを一時停止し、18(SIGCONT)で再開できます。ステータスがT(停止)に変化します。
[root@ds2 ~]# ps aux | grep nginx
root 27854 0.0 0.1 48112 1144 ? Ss 19:48 0:00 nginx: master
nginx 27855 0.0 0.2 48492 2168 ? S 19:48 0:00 nginx: worker
[root@ds2 ~]# kill -19 27854 # マスタープロセスを停止
[root@ds2 ~]# ps aux | grep nginx
root 27854 0.0 0.1 48112 1144 ? Ts 19:48 0:00 nginx: master # ステータスT
[root@ds2 ~]# kill -18 27854 # 再開
[root@ds2 ~]# ps aux | grep nginx
root 27854 0.0 0.1 48112 1144 ? Ss 19:48 0:00 nginx: master # 復帰
実践例: ユーザープロセス一括終了
pkillを用いると、ユーザーIDや端末でプロセスをまとめて操作できます。
[root@localhost ~]# w
15:46:44 up 2:19, 3 users
USER TTY FROM LOGIN@
root pts/1 :0.0 15:46
user1 pts/3 172.16.8.100 15:46
[root@localhost ~]# pkill -t pts/3 # 端末pts/3の全プロセス終了
[root@localhost ~]# pkill -9 -t pts/3 # 強制終了
[yang@host ~]$ sudo pkill -u yang # yangユーザーの全プロセス終了