2012-04-03 65 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 

除了更简单,它还让你更容易控制杀死什么,仅杀死特定用户/组拥有的进程或只杀死最旧/最新的进程。