2012-04-03 30 views
2

出來我有這個腳本,只是殺死一個應用程序BASH - 奇怪的字符從管道

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

如果我手動編寫kill命令因爲比它的工作原理oneliner。但是我必須把它作爲一個不起作用的腳本運行。所以,我試圖調試它,這裏是結果

[[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

如果將head -1添加到該管道,會發生什麼情況? – alberge 2012-04-03 09:00:39

+1

你嘗試過'killall'嗎?但是,如果你要殺死你自己的程序,[你可能想重新考慮](http://mywiki.wooledge.org/ProcessManagement)。 – l0b0 2012-04-03 09:00:58

+0

@ l0b0我沒有,我可能不會。我不想最終殺死比我應該擁有的更多流程...... – user219882 2012-04-03 09:11:40

回答

1

可能的情況下PID的返回的數量超過1 更改線路

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

這有幫助。謝謝... – user219882 2012-04-03 09:11:55

3

由於子shell返回多行,所以您得到亂碼字符的原因可能是(我無法驗證它,因爲我無法訪問您的環境)。

試試這個:

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

您可以取代所有以給pkill通話。使用-f選項,完整的命令行用於匹配(不僅僅是進程名稱),因此您仍然可以匹配路徑。

pkill -f $KEY_NAME 

除了更簡單,它還讓你更容易控制殺死什麼,僅殺死特定用戶/組擁有的進程或只殺死最舊/最新的進程。