我在一个shell脚本文件foo.sh中有这些行:
ps ax | grep -E "bar" | grep -v "grep" | awk '{print $1}' | xargs kill -9 $1
当我用这样的参数执行shell脚本时:
sh foo.sh arg_one
xargs现在无法正常工作。从shell脚本获取$ 1,而不是awk的输出。
我知道我可以将awk的输出存储到一个文件中,然后在xargs中使用它。
但是,还有更好的解决方案吗?
== edited ==
感谢@peterph的回答。 但是,有什么方法可以在xargs中使用1美元?
==编辑2 ==
感谢@Brian Campbell
尽管天气应该在示例中有一个无用的$ 1,如果给出了“shell脚本文件”的参数,那么xargs中的$ 1将无法按照我的意愿在我的计算机中工作(在您的计算机中,我也是认为)。 为什么?而且,如何避免它?
答案 0 :(得分:3)
xargs
从stdin
读取列表,如果您想要的是通过其PID终止进程,则只丢弃该行的最后一个$1
。
作为旁注,ps
也可以根据命令名打印进程(在linux上使用procps查看-C
选项)。
答案 1 :(得分:1)
除了那个复杂的管道外,你总是可以使用killall -9 name
来杀死一个进程,或者pkill -9 pattern
如果你不知道进程的确切名称但是知道一个子字符串(小心你但是,不要杀死任何非预期的进程。
要使命令正常工作,只需删除$1
; xargs
从标准输入中获取其参数,并运行命令行传递它在命令末尾从标准输入获得的值。
编辑(响应您的编辑):您希望xargs
对$1
参数做什么?你有什么期待? $1
唯一有任何含义的解释是传递给脚本的第一个参数。
$1
脚本中的awk
是awk
在其输入的第一列中找到的内容;然后打印出来,xargs
从标准输入中获取这些值,并在命令行末尾调用您传递它的命令。因此,如果awk
命令返回:
100
120
130
然后将结果传递给xargs kill -9
将导致调用以下内容:
kill -9 100 120 130
您不需要像$1
这样的变量来完成这项工作
答案 2 :(得分:0)
这应该有效:
ps ax | grep -E "bar" | grep -v "grep" | awk '{print $1}' | xargs kill -9
答案 3 :(得分:0)
您也可以尝试:
result=$(ps -ef | grep -E "bar" | grep -v "grep" | awk '{print $2}')
kill -9 $result
在我的情况下,即使存在匹配的进程,管道xargs有时也会返回错误:
usage: kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]
usage: kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]