我试图杀死这样的进程:
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
然后你就不会进行任何处理。