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

Я пытаюсь улучшить свои навыки командной строки, и я столкнулся с проблемой, из-за которой я не могу завершить процесс. Я печатаю 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 psx@xxx:/etc/grub.d$ fgtopx@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 psx@xxx:/etc/grub.d$ fgtopx@xxx:/etc/grub.d$ ps  PID TTY          TIME CMD 1723 pts/0    00:00:00 bash 2621 pts/0    00:00:00 ps

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

kill -9 {PID}

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

man kill

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

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

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

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

kill - send a signal to a process

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

Другим распространенным сигналом является ВЗДОХНУЛ который часто используется, чтобы попросить программу перечитать свои конфигурационные файлы.

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

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

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

sudo lsof -i tcp:80After That sudo kill -9 3348

где 3348 является pid запущенного процесса

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

kill(4024, SIGKILL);

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

$ ps -ax | grep my_su

Результат был:

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

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

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

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

Если вы пытаетесь завершить процесс с помощью PID, а он все еще выполняется с другим PID, похоже, что вы запустили этот процесс в другой учетной записи, скорее всего, root accout. итак, войдите в систему с помощью sudo su и убей его

Если вы приостановите процесс с помощью CTRL-z, он будет блокировать большинство сигналов до тех пор, пока он приостановлен (т.Е. Пока вы не выполните “fg” или “bg” для процесса).

Что это был за процесс? Вы проверяли, может быть, процесс был несуществующим? В этом случае вам нужно будет убить родительский процесс.

Процесс является верхним (как указано в правке). Я просто хотел попробовать перевести программу для работы в фоновый режим, а затем вернуть ее обратно.