«Kill <PID>» на самом деле не убивает процесс, почему?

118

Я пытаюсь улучшить свои навыки командной строки, и я столкнулся с проблемой, когда я не могу завершить процесс. Я набираю, kill 2200где 2200 - мой PID, и процесс не прерывается. После нескольких минут ожидания все еще в topи ps aux. Я даже пытался набрать его с sudo - безрезультатно.

Есть идеи, почему так будет?


РЕДАКТИРОВАТЬ

Я нашел странную зависимость, где fgобновляет список процессов:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
Patryk
источник
Что это был за процесс? Вы проверили, был ли процесс, возможно, больше не функционировал ? В этом случае вам нужно будет убить родительский процесс.
htorque
Процесс top(как указано в редактировании). Я просто хотел попытаться заставить программу работать в фоновом режиме, а затем вернуть ее обратно.
Patryk
2
Если вы приостановите процесс с помощью CTRL-z, он заблокирует большинство сигналов до тех пор, пока он приостановлен (т.е. пока вы не выполните a fgили bgдля процесса)
nos

Ответы:

179

Процессы могут игнорировать некоторые сигналы. Если вы отправите SIGKILL, он не сможет игнорировать его (и не поймать его для очистки). Пытаться:

kill -9 {PID}

Узнайте больше, прочитав страницу руководства:

man kill
Михал Шрайер
источник
22
Также обратите внимание, что в некоторых очень специфических обстоятельствах процесс может находиться в состоянии зомби / несуществующего, что даже SIGKILL не может убить процесс. В этом случае вам нужно будет найти родительский процесс и уничтожить родительский процесс.
Ли Райан
15
Если этот процесс выходит за рамки, то это УБИЙ ДАШЕ ДЕВЯТЬ !
Скотт
4
И иногда нет родительского процесса, в этом случае вы просто облажались. Единственный способ удалить такой процесс - перезагрузить компьютер.
user606723
2
Имя команды kill по-прежнему вводит в заблуждение многих пользователей (включая меня в начале). Предполагается, что когда вы говорите «убить Х», это означает, что вы действительно убиваете Х, а не делаете что-то еще. Я понимаю, что это ничего не изменит, но хотелось бы, чтобы они выбрали более продуманное имя ...
rbaleksandar
1
Что даже после того, kill -9как не работает, и процесс все еще торчит?
Дуглас Гаскелл
42

Если killвызывается без какого-либо параметра, он отправляет сигнал номер 15 ( SIGTERM). Этот сигнал может быть проигнорирован процессом. Этот сигнал уведомляет процесс, чтобы очистить его вещи, а затем закончить правильно сам. Это хороший способ.

Вы также можете «отправить» сигнал номер 9 ( SIGKILL), который не может быть проигнорирован процессом. Процесс даже не распознает его, потому что ядро ​​завершает процесс, а не сам процесс. Это злой путь.

Один говорит, что kill -9 <pid>всегда работает. Это заблуждение . Бывают ситуации, когда даже kill -9не убивает процесс. Например, когда процесс находится в состоянии D(непрерывный сон). Процесс переходит в это состояние каждый раз, когда он ожидает ввода-вывода (обычно не очень долго). Таким образом, если процесс ожидает ввода-вывода (например, на жестком диске с дефектом) и он не запрограммирован должным образом (с тайм-аутом), то вы просто не сможете завершить процесс . Неважно, что ты делаешь. Вы можете просто попытаться сделать файл доступным, чтобы процесс продолжался.

хаос
источник
2
Это очень полезно, я сталкивался с этим несколько раз из-за зависания доступа ввода-вывода на сетевых дисках, и мне было интересно, почему я не могу убить процессы, которые зависли. Есть ли еще документация по этой конкретной проблеме и как ее обойти?
Шелджон
7

Несмотря на то, что это имя действительно не уничтожает процессы, оно посылает ему сигналы. Со страницы руководства:

kill - send a signal to a process

Сигнал по умолчанию посланный kill [pid]является SIGTERM , который обычно , но не обязательно просит прекратить процесс. Вполне возможно написать программу, которая воспроизводит счастливую мелодию, когда вы посылаете на нее сигнал SIGTERM , но не рекомендуется.

Другим распространенным сигналом является SIGHUP, который часто используется, чтобы попросить программу перечитать свои файлы конфигурации.

Если вы действительно хотите убить программу, вам нужно использовать сигнал SIGKILLkill -9 [pid] .

Danne
источник
2

Похоже, вы можете приостановить процесс (возможно, нажав Ctrl-Z в терминале). В этом состоянии ваш процесс не будет отвечать на SIGTERM, поскольку он заморожен. Запуск 'fg' оттаивает процесс, так что он может принять сигнал и завершиться самостоятельно. Это может объяснить, почему появляется «fg» для обновления списка процессов.

user24497
источник
1
Так как же найти подключенный терминал?
ruX
0

Из C ++ я выполнил:

kill(4024, SIGKILL);

И на терминале Linux (Ubuntu),

$ ps -ax | grep my_su

Выход был:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Похоже, это (4024) еще сохранилось. Однако, как только я завершил родительский процесс, который вызвал приведенный выше оператор kill, 4024 больше не появлялся. Теперь я считаю, что «несуществующий» процесс - это не более чем отображаемая строка и решил ее игнорировать. Я надеюсь, что мой опыт может помочь кому-то там. Ура!

Парк JongBum
источник
0

Вы также можете использовать kill -lдля отображения поддерживаемых сигналов вашей архитектурой и узнать больше о сигнале, который вы можете использовать для правильной отправки сигнала.

Примечание: как уже упоминалось, использование kill -9 {PID}не рекомендуется, если это не процесс зомби. как только процесс получает SIGKILL, он немедленно отключается без очистки или каких-либо других надлежащих процедур.

amrx
источник
0

Это то, что я использовал для пилюли localhost, работающего на порту 80 (по угловой Cli) Получить информацию о запущенном приложении на порту 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

где 3348pid запущенного процесса

Аклеш Сингх
источник