ps+killのより少し楽なプロセス強制終了法

こんにちわ

[グローバルセンス株式会社](https://gb-sense.com)のskanehiraです。

今回はps+killから卒業してみようかなと思っています。
めんどくさがりなので、極力短い命令文で効率よくプロセスをkillしするのが目的です。

どうすれば簡潔化できて面倒がへるのかを考えて実践するめんどくさがり屋は
きっと人生の後半は楽できます（嘘

# **はじめに**
Linux上でアプリの異常系のテストを行うことがしばしばあると思いますが
プロセスダウンは必ずと言って良いほど試験観点に含まれるのではないでしょうか。

Linuxでプロセスを強制終了させるためには
　***プロセスIDを調べる***
　***killコマンドでプロセスIDを指定して強制終了***
という手順を踏む必要があります。

もっと簡易化できないかなぁって考えていましたが
ワンライナーはあくまでも複数行のコマンドを1行にまとめたような感じなので
打つ文字数はそんなに減るわけではないのですよね。。。

# **一般的なやり方**

※kill対象アプリはTomcatとします。

- プロセスIDを調べる  
psからプロセス一覧を取得して、grepでkill対象のアプリ名を絞りこみます。
2列目の***2070***が対象アプリのプロセスIDになります。
すでにコマンドが長い…と思うのはぼくだけでしょうか（笑）

```shell-session
MacBookAir:~ skanehira$ ps -ef | grep tomcat | grep -v grep
  501  2070     1   0  9:04AM ttys000    0:06.78 /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -Djava.util.logging.config.file=/Applications/Apache/tomcat-7.0.56/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/Applications/Apache/tomcat-7.0.56/endorsed -classpath /Applications/Apache/tomcat-7.0.56/bin/bootstrap.jar:/Applications/Apache/tomcat-7.0.56/bin/tomcat-juli.jar -Dcatalina.base=/Applications/Apache/tomcat-7.0.56 -Dcatalina.home=/Applications/Apache/tomcat-7.0.56 -Djava.io.tmpdir=/Applications/Apache/tomcat-7.0.56/temp org.apache.catalina.startup.Bootstrap start
MacBookAir:~ skanehira$

```

- kill -9 プロセスIDで強制終了  
取得したプロセスIDをkillコマンドで強制終了  

```shell-session
MacBookAir:~ skanehira$ kill -9 2070
MacBookAir:~ skanehira$ ps -ef | grep tomcat | grep -v grep
MacBookAir:~ skanehira$
```

これをワンライナーにするとこうなります。

```shell-session
ps -ef | grep tomcat | grep -v grep | xargs kill -9
```

…
長いですね…

# **プロセスIDを調べる楽な方法**

先程紹介したやり方ではpsとgrepを組み合わせてプロセスIDを取得していたが
それを一発でできるのがpgrepです。

こんな感じです。

```shell-session
# pgrepによるプロセス取得
MacBookAir:Dev skanehira$ pgrep -f tomcat
2170

# lをつけると詳細の引数などが出力されます
MacBookAir:Dev skanehira$ pgrep -fl tomcat
2170 /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -Djava.util.logging.config.file=/Applications/Apache/tomcat-7.0.56/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/Applications/Apache/tomcat-7.0.56/endorsed -classpath /Applications/Apache/tomcat-7.0.56/bin/bootstrap.jar:/Applications/Apache/tomcat-7.0.56/bin/tomcat-juli.jar -Dcatalina.base=/Applications/Apache/tomcat-7.0.56 -Dcatalina.home=/Applications/Apache/tomcat-7.0.56 -Djava.io.tmpdir=/Applications/Apache/tomcat-7.0.56/temp org.apache.catalina.startup.Bootstrap start
MacBookAir:Dev skanehira$

```

pgrepを使えば結構短縮できます。
比べてみると…

```shell-session
# pgrep
pgrep -f tomcat | xargs kill -9
kill -9 `pgrep -f tomcat`
# ps + grep
ps -ef | grep tomcat | grep -v grep | xargs kill -9
kill -9 `ps -ef | grep tomcat | grep -v grep`
```
スッキリしてきましたね。
xargsよりも``で囲ったほうがもう少しスッキリしますね。

# **プロセス名を指定してkillする方法**
pgrepとほぼおなじオプションが使えるpkillというのがあります。

```shell-session
pkill -f プロセス名
```

プロセス名の部分は部分一致で引っ掛けてくるので
同じ文字列を含むプロセスをkillしてしまう可能性がありますので、使わないようにしています。

そしてなんやかんやそのプロセスで合っているのかを確認してから
pgrepでコマンドと引数をざっくり確認してからkillするので
pgrepとkillの組み合わせになっちゃいます。

# **エイリアス/関数を定義して使う**
長いコマンドを省略するのに[エイリアスや関数](http://takuya-1st.hatenablog.jp/entry/2015/12/15/030119)を使うやり方もあります。
自分だけの環境であれば、がっつりカスタマイズしても有りかもですね。

ただ、共有サーバなどで作業する時は、さすがにカスタマイズできないのと
作業ログに自分しかわからないコマンドがあったりすると
レビューする側も大変かなと思うので個人的にはあまり乗り気じゃないです。

# **最後に**
こういった少しでも打つ文字を減らしたり
簡潔化できると作業効率は上がると思います。

塵も積もれば山となる
ですね。