BASH - 从管道中出来的怪异角色

时间:2012-04-03 08:58:13

标签: linux bash awk grep kill

我有这个简单杀死应用程序的脚本

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

如果我手动编写kill命令作为oneliner而不是它的工作原理。但是我必须把它作为一个不起作用的脚本运行。所以我试着调试它,这是结果

[user@server 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行上获取这些奇怪的字符?我怎么能摆脱他们?

3 个答案:

答案 0 :(得分: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 :(得分:1)

可能的情况是返回的pid数量超过1 将您的行更改为

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

答案 2 :(得分:1)

您可以通过拨打pkill来替换所有内容。使用-f选项,完整的命令行用于匹配(不仅仅是进程名称),因此您仍然可以匹配路径。

pkill -f $KEY_NAME

除了更简单之外,它还可让您更轻松地控制要杀死的内容,例如:仅查杀特定用户/组拥有的进程或仅查找最旧/最新的进程。