Убить процесс, который продолжает перезапуск

16

Что если «kill -9» не работает? или как убить скрипт, который запускает новые процессы? не помогает мне в любом случае.

У меня есть сценарий Python, который запускается автоматически с другим идентификатором процесса, используя тот же порт при уничтожении с помощью sudo kill -9 <pid>.

$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  13242 ubuntu    3u  IPv4  64592      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill -9 13242
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16106 ubuntu    3u  IPv4  74792      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill 16106
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16294 ubuntu    3u  IPv4  75677      0t0  TCP localhost:3002 (LISTEN)

Это не процесс зомби.

$ ps -Al

4 S     0 16289     1  0  80   0 - 12901 poll_s ?        00:00:00 sudo
4 S  1000 16293 16289  0  80   0 -  1100 wait   ?        00:00:00 sh
0 S  1000 16294 16293  0  80   0 - 34632 poll_s ?        00:00:00 python

Я даже пытался sudo pkill -f <processname>без удачи. Он не хочет умирать.

Обновить:

Это родительский процесс sh, родитель которого sudoуказан в таблице выше. Я не уверен, что безопасно убить их внезапно. Также это общий сервер Ubuntu.

Лакшминараянан Гупта
источник
Похоже, он умирает просто отлично. Ваш lsofвывод показывает новый pid каждый раз. Процесс просто перезапускается.
Патрик
Да, он не хочет умирать вечно. Просыпается, как будто никогда не умирал :(
Лакшминараянан Гупта

Ответы:

26

Автоматический запуск с другим идентификатором процесса означает, что это другой процесс. Таким образом, существует родительский процесс, который контролирует своих потомков, и если он умирает, он возрождается родителем. Если вы хотите полностью остановить службу, узнайте, как остановить родительский процесс. Убить его SIGKILL- это, конечно, один из вариантов, но, возможно, не The Right One TM , поскольку для корректного завершения работы сервисному монитору может потребоваться некоторая очистка.

Чтобы найти процесс мониторинга, вам может понадобиться просмотреть весь список процессов, поскольку фактические слушатели могут отмежеваться от своего родителя (обычно с помощью fork() + setsid()комбинации). В этом случае я нахожу вывод ps faux( procpsпо крайней мере, может отличаться для других реализаций) довольно удобным - он перечисляет все процессы в иерархическом дереве. Если не было PID-обертки (см. Также Википедию ), PID монитора должен быть меньше, чем PID любого из слушателей (если, конечно, вы не наткнулись на PID-обертку).

peterph
источник
Его родитель - тот, shчей родитель sudo. Это нормально, чтобы убить их?
Лакшминараянан Гупта
Родитель какого процесса? Тот, кто слушает порт 3002? В этом случае перечислите все процессы и догадайтесь, какой из них является монитором. С Linux procpsя обычно нахожу вывод ps -fauxдостаточно информативным. Также обратите внимание, что PID монитора должен быть меньше, чем PID фактического слушателя (если вы не включили систему в течение некоторого времени и PID уже не были обернуты, так как служба была запущена, конечно).
Петер
Отлично. ps -fauxпомог начать убивать с родителя. Можете ли вы обновить свой ответ с решением из комментария?
Лакшминараянан Гупта
Да, я думал об этом ... :)
Петер
ps fauxпомог обнаружить, supervisordкоторый бесконечно перезагружал
зависший
4

Если вы знаете порт прослушивания процесса, вы можете использовать fuserс -kфлагом.

Что-то вроде,

fuser -k 3002/tcp
Рамеш
источник