技術メモ帳 このページをアンテナに追加 RSSフィード

2006-11-02

[]pgrep, pkill を使用してプロセスを殺す 09:26 pgrep, pkill を使用してプロセスを殺すを含むブックマーク pgrep, pkill を使用してプロセスを殺すのブックマークコメント

最近、会社でシェルの操作方法について教えているのだが、

pgrep / pkill / skill / pidof といった

便利なプロセス操作系コマンドを知らない人が実に多い。

プロセスを殺すというのは、よくある作業なので

今回はコレについて書いてみる。


たとえば、これらのコマンドを知らない人が、

指定した名前のプロセスを kill する手順はだいたい

以下のようなものになることだろう。

$ ps aux | grep プロセス名 | grep -v 'grep'
# コマンドの出力結果から pid を目で確認
12345 ... .. hoge .. .. 

$ kill 12345

この作業は非常に面倒で退屈だ。

もし殺さなければならないプロセスがたくさんあったときは

どうするのだろうか。


おまけに、grep コマンド自身が候補に含まれてしまう事があるのだが、

grep -v grep

とすることで対処している。

何ともあほらしい。


さて、本題に戻って

pgrep を使った場合はどうなるのかというと、

$ pgrep -f 'プロセス名'
12345

$ kill 12345

とするだけでよい。

pgrep -f '文字列' とすると、その文字列にマッチするプロセス

pid リストが改行区切りで取得できるのだ。

たとえば、pgrep によって複数マッチした場合はこんな具合になる。

$ pgrep -f 'zsh'
12345
2222
33333
44444

もちろん、pgrep 自身の pid が含まれる事は無いように作られている。

ただ、pid だけしか出力されないので多少不安かもしれない。

そんなときは、-l オプションを付加する事で

プロセス名も一緒に表示させる事も出来る。

ちなみに、-f オプション

実行時に渡された引数もマッチ対象にするというものだ。


指定した文字列にマッチするプロセスをすべて殺したければ

xargs コマンドを組み合わせることでさらに楽をする事が出来る。

$ pgrep -f 'プロセス名' | xargs kill

もっと楽をしたいのであれば、

pkill コマンドを使用したら良い。

このコマンドは、

意図的に pgrep コマンドと同じような引数にされているため

$ pkill -f 'プロセス名'

で指定した名前のプロセスを削除する事が出来る。


関連:

PGREP / PKILL の マニュアルページ:

http://www.linux.or.jp/JM/html/procps/man1/pgrep.1.html

ps操作関係の便利なユーティリティー群 procps:

http://procps.sourceforge.net/

zioniczionic 2006/11/02 14:24 一部オプションの記述が間違っています。
--differences=cumulative

lurkerlurker 2006/11/02 22:32 わざわざありがとうございます。
修正しておきました。

taku910taku910 2006/11/03 01:47 killall -KILL foo ってのもありますよ,

木村木村 2006/11/03 02:44 なかなか面白い、さらに子プロセスの見分けがついたらいいのに。

parasporospaparasporospa 2006/11/03 06:51 FreeBSD には watch(8) という別のコマンドが入っていますね。watch(1) は ports にも見つかりませんでした。
topless というのもありますよ。
http://www.ongs.net/~daichi/

ところで lurker さんおすすめのコマンドリファレンス本ってありますか?
私はこの本しか持っていないのですが、どうせなら読んでいるだけで楽しいものが欲しいですね。
http://www.amazon.co.jp/gp/product/4894712644/

lurkerlurker 2006/11/03 07:15 >taku910さん
実は、まとめて殺しても問題ないときは killall を使っていたりします。
たしかに、この文章ですと killall 知らないような感じですね。
サンプルが悪くて申し訳ないです。
あと、kill -TERM -1 とかはよく使います。

>木村さん
-P で親プロセスの見分けはつくみたいですね。
一度もやった事が無いのでわかりませんがコレを利用すれば出来そうな気がします。
セッションIDも指定できるみたいですし。

>parasporospa さん
そうなんですよね。
BSDとLinuxだとまったく別のコマンドなんですよね。
実は僕が最初に知ったのは FreeBSD の watch だったりします。
そして、Linux で他の人の端末を監視しようとして
あれ、うまくいかない。-> 何だこの便利コマンドは!! と気づいた訳です。
(結局Linuxでは ttysnoop を使いました。)

>topless
初めて知りました。ありがとうございます。
色を付けてくれるところが非常に素敵です。
というかコレを知っていれば watch いらない気がしてきました。

anightsanights 2006/11/03 07:19 子プロセスなら-Pとか-uとかオプションで絞り込めますよ

lurkerlurker 2006/11/03 07:25 >>anightsさん
sid, pid, gid が指定できるみたいなので
完全に特定できそうですね。

lurkerlurker 2006/11/03 07:51 >>parasporospaさん
リファレンス本はもってないです。
僕自身あまりコマンドには詳しくないのですが、
普段良く使うコマンドなのでしたら、
市販のものを買っておけば問題ない気がします。

あくまで主観ですが、マニアックなものでしたら、
man を見るのが一番良いかと個人的に思っています。
実は前にも書いたのですが、manの関連セクションを
ひたすらたどっていくというのをよくやっていて
そのときに便利コマンド便利オプションを発見している気がします。
もうお読みになられてるかもしれませんが、
具体的な文献でのお勧めは、fileutils のマニュアルです。
http://www.gnu.org/software/fileutils/doc/manual/html/fileutils.html

確かコレの日本語訳がどこかにあったのですが。。

fu7mu4fu7mu4 2006/11/03 12:17 rubyのpskillがおすすめです。http://homepage1.nifty.com/~tetsu/ruby/cmd/pskill.html

lurkerlurker 2006/11/03 19:57 >fu7mu4さん
Rubyで書くと移植性が高くなりそうで良いですね。