17

我已经启动了 nginx,当我像 root 一样停止时

/etc/init.d/nginx stop

之后我输入

ps aux | grep nginx

并得到类似的回应tcp LISTEN 2124 nginx WORKER

kill -9 2124  # tried with kill -QUIT 2124, kill -KILL 2124

在我再次输入之后

ps aux | grep nginx

并得到诸如此类的回应tcp LISTEN 2125 nginx WORKER

如何杀死这个不朽的 Chuck Norris 工人?

4

3 回答 3

6

kill -9这个过程没有更多事情可做之后 - 它已经死了(或注定要死)。它停留的原因是因为(a)它的父进程还没有等待它,所以内核持有进程表条目以保持它的状态直到父进程这样做,或者(b)进程卡在一个系统调用未完成的内核(这通常意味着有错误的驱动程序和/或硬件)。

如果是第一种情况,让父母等待孩子或终止父母应该可行。大多数程序没有明确的方法让它们“等待一个孩子”,所以这可能不是一个选择。

在第二种情况下,最可能的解决方案是重新启动。可能有工具可以清除这种情况,但这并不常见。取决于内核处理正在做什么,有可能通过其他方式使其解除阻塞 - 但这需要了解该处理。例如,如果进程在某个其他进程以某种方式无限期持有的内核锁上被阻塞,则终止该其他进程可以缓解问题。

请注意,该ps命令也可以区分这两种状态。这些显示在“Z”状态。有关更多信息,请参见 ps 手册页:http: //linux.die.net/man/1/ps。它们也可能显示为“已失效”文本。

于 2013-09-02T21:45:10.050 回答
2

我遇到过同样的问题。在我的情况下,gitlab 负责带来 nginx 工作人员。当我从服务器中完全删除 gitlab 时,我能够杀死 nginx 工作人员。

  1. ps -aux | grep "nginx"

  2. 搜索工人并检查第一列是谁提出的。

  3. 杀死或卸载负责人并再次杀死工人,他们将停止产卵;D

于 2018-03-06T14:41:04.020 回答
0

我有类似的问题。

检查您是否正在使用任何自动修复程序,例如 Monit 或 Supervisor,当您尝试停止它们时,它们会运行工作程序。如果是,请禁用它们。

由于我忘记了我在 Ubuntu 的 update-rc.d 中所做的更改,我的工人正在产生。

所以我安装了sysv-rc-conf,它提供了一个干净的界面控制重启时哪些进程,你可以从那里禁用,我向你保证不会 Chuck Noris Resurrection :D

于 2016-04-13T13:38:07.620 回答