Kill Them! killコマンド色々

# Kill them!

Linuxにてプロセスを終了する様々な方法について解説します。最後にプロセスを終了するとはどういうことかを説明します。

最初に**プロセス終了コマンドとプロセスの確認コマンドをそれぞれ3つ**紹介します。
つぎに**終了コマンドを詳しく解説**し、
最後に**UNIXのシグナルについて**簡単に解説します。

## プロセスの確認コマンド3つ

- リアルタイムでインタラクティブなプロセス確認方法、`top` コマンド
- Linuxならパイプで繋ぎたいそんな確認方法は `ps auxf` コマンド
- パターンマッチで調べたい `pgrep -a` コマンド


## プロセスの終了コマンド3つ

- インタラクティブにプロセスを終了するなら、`top` コマンド
- pidを見て確認しながらプロセスを終了するなら `kill` コマンド
- pidを確認するのと同時にプロセスを終了するなら `pkill` コマンド


### topコマンドで殺す  -インタラクティブにkill-
トップコマンドで、プロセスの状況を確認しながら、特定のプロセスに特定のシグナルを送ることができます。topコマンドを起動し、`k` を押すと、pidが聞かれた後に、送りたいシグナルを入力することができます。最後にコンファメーションが出て、シグナルが送られます。

### killコマンドで殺す　-丁寧にkill-
`ps aux | grep <プロセス名>` もしくは、`pgrep <プロセス名> ` にてpidを調べます。調べたpidを使って、`kill -p <pid>`  にてシグナルを送ることができます。

### pkillコマンドで殺す -patternでkill
プロセス名をマッチングして殺すことができます。同時にマッチした複数のプロセスを終了することができます。

例えば、nginxが起動しており、master（親プロセス)とworker(子プロセス)が実行されているとします。以下のようになります。

```
root@0e1d355b28f0:/# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18504  3528 pts/0    Ss   10:03   0:00 /bin/bash
root      3470  0.0  0.0 140624  1520 ?        Ss   10:11   0:00 nginx: master process /usr/sbin/nginx
www-data  3471  0.0  0.1 141000  3428 ?        S    10:11   0:00  \_ nginx: worker process
www-data  3472  0.0  0.1 141000  3428 ?        S    10:11   0:00  \_ nginx: worker process
```

`pkill nginx`   これでnginxのプロセスを終了することができます。

また、`-f` オプションでは、プロセス名だけではなく、オプションを含めた全てのプロセス名がパターンマッチの対象になります。
`pkill`は、`pgrep`とセットで使うことでどのプロセスが対象になるのかを事前に調べることができます。 `pgrep` と`pkill` は共有しているので、pgrepにて対象のプロセスを調べることができます。

いかに、プロセス名にて検索、`-f` オプションにてプロセス名全体にて検索の例を示します。

```
root@0e1d355b28f0:/# root@0e1d355b28f0:/# ps auxf | grep nginx
root      3789  0.0  0.0 140624  1512 ?        Ss   10:57   0:00 nginx: master process /usr/sbin/nginx
www-data  3790  0.0  0.1 141000  3384 ?        S    10:57   0:00  \_ nginx: worker process
www-data  3791  0.0  0.1 141000  3384 ?        S    10:57   0:00  \_ nginx: worker process
```

```
root@0e1d355b28f0:/# pgrep -a nginx
3789 nginx: master process /usr/sbin/nginx
3790 nginx: worker process
3791 nginx: worker process
```

```
root@0e1d355b28f0:/# pgrep -a -f master 
3789 nginx: master process /usr/sbin/nginx
```

```
root@0e1d355b28f0:/# pgrep -a -f worker        
3790 nginx: worker process
3791 nginx: worker process
```

意図的に、先にnginxのmasterプロセスにSIGKILLをシグナルを送り、親プロセスのみ強制終了します（シグナルについては後述）。そのあとに親プロセスが消えた子プロセス(= Orphan process)のwoker(子プロセス）を`pkill -f `を使って終了してみます。

```
root@0e1d355b28f0:/# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18616  3552 pts/0    Ss   10:03   0:00 /bin/bash
root      3789  0.0  0.0 140624  1512 ?        Ss   10:57   0:00 nginx: master process /usr/sbin/nginx
www-data  3790  0.0  0.1 141000  3384 ?        S    10:57   0:00  \_ nginx: worker process
www-data  3791  0.0  0.1 141000  3384 ?        S    10:57   0:00  \_ nginx: worker process
root      3805  0.0  0.1  34396  2828 pts/0    R+   11:02   0:00 ps auxf
root@0e1d355b28f0:/# pkill -KILL -f master
root@0e1d355b28f0:/# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18616  3552 pts/0    Ss   10:03   0:00 /bin/bash
www-data  3790  0.0  0.1 141000  3384 ?        S    10:57   0:00 nginx: worker process
www-data  3791  0.0  0.1 141000  3384 ?        S    10:57   0:00 nginx: worker process
root      3807  0.0  0.1  34396  2792 pts/0    R+   11:02   0:00 ps auxf
root@0e1d355b28f0:/# pkill -KILL -f worker
root@0e1d355b28f0:/# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18616  3552 pts/0    Ss   10:03   0:00 /bin/bash
root      3809  0.0  0.1  34396  2944 pts/0    R+   11:02   0:00 ps auxf
```

## プロセスの終了とは  シグナルについて
プロセスの終了は各プロセスにシグナルを送ることで外部から非同期にプロセスのコントロールを行います。
`top` `kill` `pkill` 全てのコマンドで_デフォルトのシグナル(SIGTERM/15)_です。つまり、TERMシグナルを送ることで、プロセスを終了しています。

TERM以外のシグナルを送ることも可能です。各シグナルは番号と英語による表記があります。

`kill` `pkill` 共に　`-<signal>` にてシグナルを送ることができます。これは数字でも文字でも可能です。例えば、`kill -KILL` もしくは `kill -9` 

`kill -l`コマンドでシグナルの一覧を出力することが可能です。

```
root@0e1d355b28f0:/# 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
63) SIGRTMAX-1	64) SIGRTMAX
```