2012-04-03 9 views
2

から出た私は、私はそれが動作よりもonelinerとして手​​動でkillコマンドを記述する場合、単にアプリBASH - 変な文字がパイプ

KEY_NAME=/some/path 
kill `ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'` 
exit 0 

を殺す、このスクリプトを持っています。しかし、私はそれが動作しないスクリプトとして実行する必要があります。だから私はそれをデバッグしようとしましたが、ここでの結果は

[[email protected] logs]$ bash -x ./script.sh 
+ KEY_NAME=/some/path 
++ ps -ef 
++ grep /some/path 
++ grep -v grep 
++ awk '{ print $2 }' 
+ kill $'20557\r' 
: arguments must be process or job IDs 
+ exit 0 

ですなぜkillライン上でこれらの奇妙な文字を取得しておくのですか?どうすればそれらを取り除くことができますか?

+0

あなたは頭を追加した場合はどうなり-1そのパイプラインに? – alberge

+1

あなたは 'killall'を試みましたか?しかし、あなたが自分のプログラムを殺しているなら、[あなたは再考したいかもしれません](http://mywiki.wooledge.org/ProcessManagement)。 – l0b0

+0

@ l0b0私はしていないと私はおそらくしません。私は私が持っているべきであるよりも多くのプロセスを殺すことに終わりたくない... – user219882

答えて

1

はケースである可能性がありますPIDの数が返されますがpkillを呼び出して、すべてのものを置き換えることができます以上1 が

ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'|xargs kill 
+0

これは助けになりました。ありがとうございました... – user219882

3

あなたはちんぷんかんぷんの文字を取得する理由は、複数行を返すサブシェルに(私はあなたの環境へのアクセスを持っていないので、私はそれを確認することはできません)、おそらくです。

はこれを試してみてください:

KEY_NAME=/some/path 
for pid in $(ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }') 
    do 
    kill $pid 
    done 
exit 0 
1

にあなたの行を変更します。 -fオプションを使用すると、(プロセス名だけでなく)完全なコマンドラインがマッチングに使用され、パスに対しても一致することができます。別に簡単であるから

pkill -f $KEY_NAME 

、それは例えば、あなたが殺すものを超える容易に制御することができます特定のユーザー/グループが所有しているプロセスのみを削除するか、最も古い/最新のプロセスのみを強制終了します。

関連する問題