1

我在一个 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 中使用它。

但是,有没有更好的解决方案?

==已编辑==

感谢@peterph 的回答。但是,有什么方法可以在 xargs 中使用 $1 吗?

== 已编辑 2 ==

谢谢@Brian Campbell

尽管天气不好,示例中应该有一个无用的 $1,如果给出“shell 脚本文件”的参数,那么 xargs 中的 $1 将无法在我的计算机中按我的意愿工作(我认为也在你的计算机中)。为什么?而且,如何避免呢?

4

4 回答 4

3

xargs从中读取列表,如果您想要通过它们的 PID 杀死进程,stdin只需丢弃最后一行。$1

作为旁注,ps还可以根据命令名称打印进程(在 linux 上使用 procps 查看-C选项)。

于 2012-11-26T16:40:26.607 回答
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使这项工作一样的变量

于 2012-11-26T16:48:09.303 回答
0

这应该有效:

ps ax | grep -E "bar" | grep -v "grep" | awk '{print $1}' | xargs kill -9
于 2012-11-26T16:43:07.563 回答
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 ]
于 2013-03-28T12:06:49.530 回答