具有动态ID的进程不会被杀死;没有父母

具有动态ID的进程不会被杀死;没有父母

我试图杀死这样的进程:

root@xxx:~# ps -ef | grep mosquitto
root        3083    1912  0 11:59 pts/0    00:00:00 grep --color=auto mosquitto
root@xxx:~# kill 3083
-bash: kill: (3083) - No such process
ps -ef | grep mosquitto
root        3175    1912  0 12:00 pts/0    00:00:00 grep --color=auto mosquitto
root@xxx:~# ps -ef | grep mosquitto | head -c 16 | tail -c 4
3255root@xxx:~# kill $(ps -ef | grep mosquitto | head -c 16 | tail -c 4)
-bash: kill: (3290) - No such process
root@xxx:~# pgrep mosquitto | xargs -i pstree -ps {}
root@xxx:~#

我怎样才能杀死这个进程?

答案1

另一个答案是正确的,但细节上有点短。

root@xxx:~# ps -ef | grep mosquitto
root        3083    1912  0 11:59 pts/0    00:00:00 grep --color=auto mosquitto

请注意,仅返回一个进程,带有命令行grep --color=auto mosquitto。这是grep mosquitto来自命令行的,用于过滤输出ps。您的 shell 很可能有一个别名grep=grep --color=auto

一旦您收到下一个 shell 提示符,grep上一个命令就已经终止,因此没有具有该 pid 的进程需要终止。当您再次执行相同的命令时,grep会创建一个新进程,并且它的 PID 与之前的不同grep

grep进程可能会也可能不会出现在输出中,这取决于调度。但是每当您 grep 的输出时ps,您应该假设该grep进程可能出现在输出中。如果您手动执行此操作,请忽略此结果。如果您在脚本中需要它,有几种技术可以避免它。

ps | grep mosquitto | grep -v grep

忽略所有包含grep- 的行

ps | grep '[m]osquitto'

这不会创建额外的进程。它之所以有效,是因为[m]作为仅包含 letter 的字符类m,因此它与预期模式匹配,但与参数不匹配grep

根据您要搜索的内容,该pgrep命令也可能有用。

答案2

您的进程不存在,请执行以下操作:

ps ax  |grep  mosquitto|grep -v grep

然后你就不会进行任何处理。

相关内容