我正在尝试终止与 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
为了完整性,我还建议使用命令pgrep
和pkill
。
pgrep [-lf] [-u uid] [-other options] pattern
列出与扩展正则表达式模式匹配的进程pkill [-f] [-t**SIGNAL] pattern
杀死与模式匹配的进程
最有趣的选择,如图所示,可能是
-f
匹配进程的完整命令行-u user
仅匹配特定用户进程(也包括组......)-l
列出进程名称/标识符(仅限 pgrep)
对于其他内容,请参阅精美手册。
killall
总而言之,这些比上面发布的更复杂的管道配方更加通用和实用(就能够在杀死之前实际检查您杀死的东西而言) 。
答案4
或者
killall mysql
命令可能会帮你完成这个任务。它使用名称而不是 PID。