awk 的管道输出以 kill -9

awk 的管道输出以 kill -9

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

ps -A | grep mysql | awk '{print $1}'

它有(为了本例的目的,是假的)输出

11111
22222
33333  # process id to be excluded

我假设我可以将其通过管道传输到 xargs kill -9 ,如下所示:

ps -A | grep mysql | awk '{print $1}' | xargs kill -9

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

答案1

这里可能最简单的事情就是使其grep不匹配其自己的命令:

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9

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

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

答案2

Awk 有一个 system() 命令,允许您直接杀死它......就像这样。

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

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

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

答案3

为了完整性,我还建议使用命令pgreppkill

  • pgrep [-lf] [-u uid] [-other options] pattern列出与扩展正则表达式模式匹配的进程
  • pkill [-f] [-t**SIGNAL] pattern杀死与模式匹配的进程

最有趣的选择,如图所示,可能是

  • -f匹配进程的完整命令行
  • -u user仅匹配特定用户进程(也包括组......)
  • -l列出进程名称/标识符(仅限 pgrep)

对于其他内容,请参阅精美手册。

killall总而言之,这些比上面发布的更复杂的管道配方更加通用和实用(就能够在杀死之前实际检查您杀死的东西而言) 。

答案4

或者

killall mysql 

命令可能会帮你完成这个任务。它使用名称而不是 PID。

相关内容