2009-05-21 6 views
1

私は、killallがkillallを生成するプロセスを強制終了せずに実行される同じ名前のプロセスにkillallを使用したいと思います。同じ名前のプロセスでkillall

さらに詳しくは、私はプロセスfooを持っていて、プロセスfooが実行されているとします。私は "foo -k"を実行し、新しいfooに古いfooを殺すことができるようにしたい。

答えて

4
pgrep foo | grep -v $$ | xargs kill 

あなたはpgrepを持っていない場合は、関心のPIDのリストを生成するいくつかの他の方法を考え出す必要があります。いくつかのオプションがあります:

  1. 使用のgrepのいくつかの組み合わせに続いて、適切なオプションを使用して、PS、sedのおよび/またはPIDをプロセスにマッチして抽出するのawk。

  2. killallは、SIGTERMの代わりに信号0を送信できます。この標準的なセマンティクスはシグナルを送信せず、プロセスが生きているかどうかを判断するだけです。恐らく、killallを使ってプロセスリストを選択し、それが生きているもののPIDを印刷するようにすることができます。これはおそらく、sedを使って少しの後処理を必要とするでしょう。

  3. Linuxの/procファイルシステムの行には、システムデータを保持している擬似ファイルがあるかもしれません。ここでも、grep/awk/sedはあなたの友人です。

あなたが本当にこのコメントを行うか、私にメールを送って、私はより詳細にこれらのオプションの一部を拡大してみましょうする方法についての特定の詳細が必要な場合。

[編集:のpgrepない人のための追加、さらにオプション]を

+0

ニース!私は、デフォルトのOS Xのインストールのコンテキストで行うことができる必要があるが、pgrepを持っていないように指定する必要があります。 – user53937

+0

ピドフはありますか? – bdonlan

2

これは、OS X上で動作するようです:

killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/' 

killallを-sそれは一度に、1つのPIDをどうなるのか示しています。あなた自身を殺すこと以外は何をしますか。

+1

-sはLinuxでは動作が異なりますので、今後これを移植する場合は注意が必要です。 – bdonlan

1

それはデーモンモードで実行されたときに、これを解決するための通常の方法は、ファイルにそのプロセスIDを書き込むfoo持つことで、/var/run/foo.pidのようなものを言います。次に、デーモン以外のバージョンにPIDファイルからPIDを読み込ませ、その上にkill(2)を直接呼び出すことができます。これは通常、Apacheなどがそれをどのように処理するかです。もちろん、最新のOSXデーモンはlaunchd(8)になりますが、古い旧式の信号を使用するデーモンはまだまだあります。

関連する問題