Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

こんにちわ

グローバルセンス株式会社のskanehiraです。

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

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

はじめに

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

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

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

一般的なやり方

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

  • プロセスIDを調べる
    psからプロセス一覧を取得して、grepでkill対象のアプリ名を絞りこみます。 2列目の2070が対象アプリのプロセスIDになります。 すでにコマンドが長い…と思うのはぼくだけでしょうか(笑)
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コマンドで強制終了
MacBookAir:~ skanehira$ kill -9 2070
MacBookAir:~ skanehira$ ps -ef | grep tomcat | grep -v grep
MacBookAir:~ skanehira$

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

ps -ef | grep tomcat | grep -v grep | xargs kill -9


長いですね…

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

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

こんな感じです。

# 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を使えば結構短縮できます。
比べてみると…

# 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というのがあります。

pkill -f プロセス名

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

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

エイリアス/関数を定義して使う

長いコマンドを省略するのにエイリアスや関数を使うやり方もあります。
自分だけの環境であれば、がっつりカスタマイズしても有りかもですね。

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

最後に

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

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

gorilla0513
https://twitter.com/gorilla0513
https://github.com/skanehira
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away