awk 的管道输出以杀死 -9

wel*_*lly 6 unix bash kill awk xargs

我试图杀死任何与 mysql 相关的进程。我正在拼凑一个命令,到目前为止,还没有想出正确的解决方案。另一个考虑是,最后一个进程将对应于命令“grep mysql”——下面命令的一部分。到我尝试杀死它时,此进程将不再存在,因此需要将其从通过管道传输到 kill -9 的输入中排除。完成此任务的最佳方法是什么?到目前为止,我有不完整的命令:

ps -A | grep mysql | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

它具有(假的,就本示例而言)输出

11111
22222
33333  # process id to be excluded
Run Code Online (Sandbox Code Playgroud)

我假设我可以像这样将它传递给 xargs kill -9 :

ps -A | grep mysql | awk '{print $1}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

并找出排除最后一个 pid 的方法,但我尝试的所有方法似乎都无法正常工作。

Fat*_*ror 19

可能在这里最简单的事情是 make grepnot match 自己的命令:

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

m 周围的括号使其成为仅包含 m 的字符集,它不会更改模式但不会在ps输出中与自身匹配。这是避免此问题的规范方法。我还想补充一点,如果您有pkill运行pkill -9 mysql更容易的命令。

还值得注意的是,您应该尽可能避免使用 SIGKILL (-9),因为它不会让目标进程有机会正常退出。如果您还没有,您应该先尝试使用 SIGTERM(默认)。


tec*_*rus 6

awk 有一个 system() 命令,可以让你直接杀死它......像这样的东西。

ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'
Run Code Online (Sandbox Code Playgroud)

方括号的原因与前面类似。它可以防止 awk 被杀死并关闭管道。

/string/ 将执行类似 grep 的行匹配。