2009-06-04 10 views
7

私は非常に単純な問題があります。シェルスクリプトを実行すると、 が無限ループで動作するプログラムを起動します。しばらくしてから、私は 異なるパラメータでもう一度それをすることができます前に、このプログラムを停止したいと思います。質問は今私がそれを実行すると のプログラムのPIDを見つける方法はありますか?基本的に、私はそのようなことをしたい:シェルスクリプトでのkillプロセス

echo "Executing app1 with param1" 
./app1 param1 & 
echo "Executing app1" 
..do some other stuff 
#kill somehow app1 
echo "Execution of app1 finished!" 

ありがとう!

答えて

0
killall app1 
2

あなたは

ps ux | awk '/app1/ && !/awk/ {print $2}' 

とAPP1のPIDを取得し、あなたがAPP1の複数のインスタンスをした場合(ただし、あなたが「殺すこと....それを殺すことができるはずですem all)

5

bash $!ではバックグラウンドで開始された最後のプロセスのPIDに展開されます。だから、あなたが行うことができます(BourneシェルとCを含む)ほとんどのシェルで

./app1 param1 & 
APP1PID=$! 
# ... 
kill $APP1PID 
+0

すべての回答ありがとうございますが、こちらは私のお気に入りです! –

15

を、あなたは、バックグラウンドで立ち上げ、最後のサブプロセスのPIDは特別な変数$に格納されます!

#!/bin/bash 
./app1 & 
PID=$! 
# ... 
kill $PID 

特殊変数セクションの下にsome information hereがあります。あなたがプロセスのPIDを知りたい場合は

3

、あなたはps使用することができます。

[[email protected] ~]$ ps h -o pid -C app1 

パラメータ-o pidはあなたが唯一のプロセスのPID、-C app1はの名前を指定したいと言っています問合せするプロセス、およびパラメータhが結果表のヘッダーを抑制するために使用されます(PID自体の上に「PID」ヘッダーがない場合)。同じ名前のプロセスが複数ある場合は、すべてのPIDが表示されます。

あなたがそのプロセスを強制終了したい場合は、あなたが使用することをお勧めします:

[[email protected] ~]$ kill `ps h -o pid -C app1` 

あなただけのことをしたい場合(そして、あなたがすべての「APP1」のプロセスを殺す気にしない場合killallはきれいですが、 )。最初のPIDまたは最後のPIDのみを使用する場合は、それぞれheadまたはtailを使用することもできます。

fishユーザーのヒント:%processは、processのPIDに置き換えられます。そう、魚には、あなたが使用できます。

[email protected] ~> kill %app1 
0

私は私が殺したプロセスは、Pythonスクリプトという問題があったと私はまたのpythonを実行していた別のスクリプトを持っていました。私は他のスクリプトのためにPythonを殺したくありませんでした。

私は(のMyScriptがあなたのPythonスクリプトであるとする)これに対処するためのawkを使用: ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

を殺すように効率的ではないかもしれませんが、私はむしろ、このようなタスクで汎用性のための効率を交換したいです。

関連する問題