[LInux] プロセスをkillする、シグナルを送る方法

[LInux] プロセスをkillする、シグナルを送る方法

プロセスを kill するコマンド

Linux でプロセスを強制的に終了させるには kill コマンドを使用します。

kill コマンド でシグナル送信

kill コマンドはプロセス(ジョブ)に対してシグナルを送ります。プロセスは送信されたシグナルを受けて、何かしらのふるまいを行います。

もし強制的にプロセスを終了させたい場合は、SIGKILL シグナル(シグナル番号9)を送信します。SIGKILL を受け取ったプロセスは強制的に終了させられます。

kill -9: 強制終了

kill -9 [PID] で指定されたプロセス番号のプロセスを強制的に終了させられます。例えば sleep 1000 & で1000秒待機するだけの処理をバックグラウンドで実行します。実行すると PID が表示されるのでそれを kill してみます。

# 1000秒待機をバックグラウンドで実行(PID=818)
$ sleep 1000 &
[1] 818

# PID=818 を強制終了
$ kill -9 818

# プロセス終了を確認
$ ps
  PID TTY          TIME CMD
  603 tty1     00:00:00 bash
  820 tty1     00:00:00 ps
[1]+  Killed                  sleep 1000

kill した後、ps コマンドでプロセスを確認すると kill が確認できました。

コマンドのシグナルいろいろ

kill -lkill コマンドが送信できるシグナルが一覧できます。

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

シグナル番号とシグナル名が確認できます。kill コマンドはシグナル番号でもシグナル名でも指定可能です。

すべてのシグナルを覚えるのは大変ですので代表的なものだけまとめます。

シグナル番号 シグナル名 意味
1 SIGHUP ハングアップ。端末の回線が切れたときに発生するシグナル。nohup でプロセスが SIGHUP を受け付けなくなる。
2 SIGINT 割り込み。Ctrl+C 押下で送信されるシグナル。デフォルトでプロセスを終了させる。
3 SIGQUIT 中止。Ctrl+\ 押下で送信されるシグナル。
9 SIGKILL 強制終了シグナル。
15 SIGTERM 終了シグナル。シグナル番号省略時のデフォルト。無視できる。
20 SIGTSTP 端末からの一時中断シグナル。Ctrl+Z 押下で送信されるシグナル。バックグラウンドに処理を移すときなどに使う。

その他いろいろあるシグナルは man 7 signal で確認したいり、Wikipedia のページを確認してください。

シグナルをキャッチする

シグナルに対してプロセスがどのようにふるまうかはプロセス側の実装に依存します。

例えばシェルスクリプトを以下のように実装すると、任意シグナルをキャッチできます。

シグナルは複数同時にスペース区切りで指定できます。

trap [任意コマンド] [シグナルリスト]

以下のスクリプトは Ctrl+C 押下で送信される SIGINT をキャッチしてみます。

my_script.sh

#!/bin/bash

trap 'echo "catch SIGINT"' 2

sleep 10000

以下のように実行し、Ctrl+C を押下してみます。

$ bash my_script.sh
^Ccatch SIGINT

SIGINT のシグナルをキャッチして任意の処理が実行できました。

シグナルを無視する

送信されたシグナルは無視することもできます。例えば Ctrl+C を無視して勝手に終了されないようにもできます。

my_script.sh

#!/bin/bash

# Ctrl+C で送信される SIGINT を無視する
trap '' SIGINT

sleep 10000

trap '' SIGINT でシグナルキャッチ時の処理を空文字で何も指定しないと処理をせず無視します。終了もしません。実行して Ctrl+C を押下してみます。

# Ctrl+C を押下しても反応しない
$ bash my_script.sh
^C^C^C^C^C^C^C^C^C

Ctrl+C を押下しても終了しません。早く終了したければ10000秒待つか kill するかログアウトしてください。

trap '' SIGKILL としても強制的にプロセスを終了するのは無視できません。

以上。

参考URL

Linuxカテゴリの最新記事