Как убить этого бессмертного работника nginx?

Я начал 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 и т.д.

Как убить этого бессмертного рабочего Чака Норриса?

Ответ 1

После kill -9 нечего делать с процессом - он мертв (или обречен на смерть). Причина, по которой это происходит, заключается в том, что либо (а) он родительский процесс еще не дождался, поэтому ядро ​​содержит запись таблицы процессов, чтобы сохранить ее статус до тех пор, пока родитель не сделает этого, или (б) процесс не застрял на системный вызов в ядро, которое не заканчивается (что обычно означает багги-драйвер и/или аппаратное обеспечение).

Если первый случай, заставить родителя ждать ребенка или прекратить работу родителя, должен работать. У большинства программ нет четкого способа заставить их "ждать ребенка", поэтому это может быть не вариант.

Во втором случае наиболее вероятным решением является перезагрузка. Там могут быть инструменты, которые могли бы очистить такое состояние, но это не так. В зависимости от того, что делает эта обработка ядра, возможно, ее можно будет разблокировать с помощью других средств, но для этого требуется знание этой обработки. Например, если процесс блокируется при блокировке ядра, что какой-то другой процесс каким-то образом удерживается на неопределенный срок, завершение того, что другой процесс может облегчить проблему.

Обратите внимание, что команда ps также может различать эти два состояния. Они отображаются в состоянии "Z". См. Страницу man ps для получения дополнительной информации: http://linux.die.net/man/1/ps. Они могут также отображаться с текстом "несуществующим".

Ответ 2

У меня была аналогичная проблема.

Проверьте, используете ли вы какой-либо автоматический целитель, например Monit или Supervisor, который запускает рабочего, когда вы пытаетесь их остановить. Если да, отключите их.

Мои рабочие рождались из-за изменений, которые я забыл в update-rc.d в Ubuntu.

Итак, я установил sysv-rc-conf, который дает чистый интерфейс управления процессами при перезагрузке, вы можете отключить его, и я заверяю вас нет Чак Норис Воскресение: D

Ответ 3

У меня была такая же проблема. В моем случае gitlab был ответственным, чтобы привести работников nginx. когда я полностью удалил gitlab с моего сервера, я смог убить рабочих nginx.

  • ps -aux | grep "nginx"

  • Найдите рабочих и проверьте в первом столбце, который их воспитывает.

  • убить или unistall ответственного и убить рабочих снова, они остановятся на нерестах, D