Вопрос «Kill » не убивает процесс, почему?


Я пытаюсь улучшить свои навыки командной строки, и я столкнулся с проблемой, когда я не могу убить процесс. Я печатаю 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

100
2017-09-03 07:47


происхождения


Какой процесс был? Вы проверяли, может ли процесс быть умерший? В этом случае вам нужно будет убить родительский процесс. - htorque
Этот процесс top (как указано в редакции). Я просто хотел попробовать запустить программу для работы в фоновом режиме, а затем вернуть ее обратно. - Patryk
Если вы приостановите процесс с помощью CTRL-z, он заблокирует большинство сигналов, пока он приостановлен (т. Е. До тех пор, пока вы не выполните fg или bg для процесса) - nos


ответы:


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

kill -9 {PID}

Подробнее читайте на странице руководства:

man kill

150
2017-09-03 08:09



также отметим, что в некоторых очень специфические обстоятельства, процесс может быть в состоянии зомби / несуществующего, что даже SIGKILL не может убить процесс. В этом случае вам придется найти родительский процесс и убить родительский процесс. - Lie Ryan
Если этот процесс выходит из строя, то это KILL DASH NINE! - scottl
И иногда нет родительского процесса, и в этом случае вы просто ввернуты. Единственный способ удалить такой процесс - перезагрузить компьютер. - user606723
Вы также можете просто использовать pkill process, где процесс - это имя процесса вместо идентификатора процесса. - RobinJ
Имя команды kill продолжает вводить в заблуждение для многих, многих пользователей (включая меня в начале). Предполагается, что когда вы говорите «убить X», это означает, что действительно убить X, а не делать что-то еще. Я понимаю, это ничего не изменит, но я бы хотел, чтобы они выбрали более продуманное имя ... - rbaleksandar


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

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

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


32
2018-06-10 06:22



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


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

kill - send a signal to a process

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

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

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


7
2017-09-06 11:51





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


2
2017-09-06 15:00



Итак, как найти подключенный терминал? - ruX


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

kill(4024, SIGKILL);

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

$ ps -ax | grep my_su

Выход был:

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

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


0
2018-03-10 23:51