Linuxプロセス管理におけるシグナル制御の実践

シグナルを用いたプロセス制御手法

Linuxシステムでは、killkillallpkillといったコマンドを用いてプロセスにシグナルを送信できます。各コマンドの特徴は以下の通りです。

  • 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で利用可能な全シグナルを確認できます。以下は頻出するシグナルです。

番号名称動作
1SIGHUP設定再読込(プロセス再起動)
2SIGINTキーボード割込み(Ctrl+C相当)
3SIGQUITキーボード終了
9SIGKILL強制終了(捕捉不可)
15SIGTERM正常終了(デフォルト)
18SIGCONT停止からの再開
19SIGSTOPプロセス停止(捕捉不可)
20SIGTSTP一時停止(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ユーザーの全プロセス終了

タグ: Process signal kill killall pkill

7月20日 22:49 投稿