我正在尝试修复 nginx 的问题,并认为我的机器上正在运行一个 nginx 进程。当我运行这个命令时,我得到这个输出。
$ ps aux -P | grep nginx
1000 3947 0.0 0.0 13596 932 pts/0 S+ 14:05 0:00 grep --color=auto nginx
但如果我尝试终止进程 1000、3947、13596 或 932,我会收到如下错误:
bash: kill: (1000) - No such process
发生了什么事?如何找到并终止 nginx 进程?
答案1
我通常觉得pgrep
比 更方便ps | grep
。您可能还想看看killall
最终目标是否是按名称删除一堆进程。
答案2
ps aux -P
显示这些列:
$ ps aux -P | head -1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
只有第二列是 pid。
警告:不要尝试杀死随机的 pid。
pid 3947 是当您收到提示时结束的 grep 进程,因此确实不存在这样的进程。
如果有 nginx 进程,您会在 grep 输出中看到它。结论:nginx 没有在您的机器上运行。
答案3
避免grep
命令本身出现在ps
输出中的一个常见技巧是将第一个字符放入字符类中,这样它就不会与其文字本身相匹配。 IE,
$ ps aux | grep [n]ginx
这样,grep
模式将匹配“nginx”,但不匹配输出中显示的文字“[n]ginx” ps
。
答案4
很多时候您必须使用它sudo
来管理nginx
流程。sudo
如果出现“不允许操作”错误,请在下面的所有命令前面加上前缀。虽然这个问题被标记为“ps”,但我想提一下其他机会。
如果你只是想停止 nginx,我建议使用:
service nginx stop
但如果您的目的是查找“pid”本身(例如发送信号),我建议您寻找nginx.pid
.一旦 nginx 启动,它将把它的 pid 放入这个文件中。
nginx
可以用信号来控制。 master进程的进程ID默认写入文件/usr/local/nginx/logs/nginx.pid
不过,它可能在其他地方。
如果你有自己编译的nginxpid-path
您也可以指定。
--pid-path=path
nginx.pid
— 设置将存储主进程的进程 ID 的文件的名称。安装后,始终可以使用 pid 指令在 nginx.conf 配置文件中更改文件名。默认情况下,该文件名为 prefix/logs/nginx.pid
否则,您可以在 中显式指定 pid 文件的路径nginx.conf
。
阅读Nginx 控制
因此,要发送信号只需键入:
kill `cat /path/to/nginx.pid`
或者
kill $(cat /path/to/nginx.pid)
阅读通过pid文件杀死进程。
就个人而言,编写脚本或部署指令时,我不会委托停止或搜索 nginx pid,pgrep
尤其是在 上grep
,尽管它们适用于本地计算机。但在这种情况下,我会将停止缩短为pkill
(进程终止):
pkill nginx