Как убить процесс, который нельзя убить без перезагрузки?

11

Есть 5 процессов, которые не могут быть прерваны, kill -9 $PIDи выполнение cat /proc/$PID/cmdlineбудет зависать от текущего сеанса. Может быть, это процессы зомби.

Выполнение ps -ef or htopтакже приведет к зависанию текущего сеанса. Но topи ps -eработают нормально.

Таким образом, кажется, что есть две проблемы, файловая система не отвечает.

Это рабочая машина с виртуальными машинами, поэтому перезагрузка не возможна.

Следующие идентификаторы процессов не работают: 16181 16765 5985 7427 7547

Родителем этих процессов является init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

И один из процессов QEMU не работает

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
Сэм Стоилинга
источник
1
Зомби-процессы не должны вызывать проблем. Если число процессов Zombie настолько велико, что превышает лимит процессов на сервере, это вызовет проблему.
Раза
@Salton: Мы не можем использовать ps -ef и htop, поэтому у нас возникли проблемы, может быть, то, что мы видим, не называется процессом зомби?
Сэм Стоилинга
1
Вы можете попытаться отследить, используя, /usr/bin/strace ps -efчтобы увидеть, где именно ваш ps -efвисит.
Раза
2
Как вы определили, что это зомби? Это скорее похоже на процессы зависания. Работает ps -elи в каком состоянии эти процессы?
Нильс
В конце концов, клиент все же решил перезагрузить машину, поскольку проблемы становились все хуже и хуже. Спасибо за весь вклад. Узнал много о зомби и бесперебойных процессах.
Сэм Стоилинга

Ответы:

22

У тебя нет зомби. cat /proc/$PID/cmdlineне будет никаких проблем с зомби. Если программа kill -9не убивает , это означает, что она выполняет непрерывную операцию ввода-вывода. Это обычно указывает на одну из трех вещей:

  • сетевая файловая система, которая не отвечает;
  • ошибка в ядре;
  • аппаратная ошибка.

Утилиты, такие как psможет зависнуть, если они пытаются прочитать некоторую информацию, такую ​​как путь к исполняемому файлу процесса, который ядро ​​не предоставляет по одной из вышеуказанных причин.

Попробуйте cat /proc/16181/syscallпосмотреть, что делает процесс 16181. Это может или не может работать в зависимости от того, как далеко зашла ваша система.

Если проблема связана с сетевой файловой системой, вы можете ее принудительно размонтировать или подключить к сети. Если проблема заключается в ошибке ядра или оборудования, то, что вы можете сделать, будет зависеть от характера ошибки. Настоятельно рекомендуется перезагрузка (и обновление до фиксированного ядра или замена сломанного оборудования).

Жиль "ТАК - перестань быть злым"
источник
Кошка никогда не отвечает. Я не думаю, что это ошибка. Я думаю, что это «особенность».
Сова
7

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

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

Дэвид Баггерман
источник
Слишком много процессов-зомби могут помешать forkуспешному выполнению (при nrpocдостижении сложного уровня), поскольку они все еще занимают место в таблице процессов.
17
2

Чтобы найти процессы зомби в Linux:

$ ps axo stat, ppid, pid, comm | grep -w перестал существовать

Z 555 10242 Черт-Зомби <не существующий>

Сначала вы можете попробовать отправить сигнал SIGCHLD родительскому процессу зомби с помощью команды kill. Обратите внимание, что приведенная выше команда дает вам PPID (PID родительского процесса) каждого зомби. В нашем примере PPID зомби есть 555.

$ sudo kill -s SIGCHLD 555

Если процесс зомби все еще не исчезает, вы можете убить родительский процесс (например, 555) зомби.

$ sudo kill -9 555

Как только его родительский процесс будет уничтожен, зомби будет принят процессом init, который является родителем всех процессов в Linux. Процесс init периодически вызывает wait()любой процесс зомби.

HamTheAstroChimp
источник
Это настоящий ответ. Убийство родителя сработало, спасибо.
Андрей
1

Вы можете убить только зомби, убив его родителей. Зомби-процесс освободил все свои ресурсы и ожидает, когда его родительский объект получит статус выхода. Это становится зомби, когда родитель не выполняет, waitчтобы получить статус выхода от своего ребенка. Когда вы убиваете родителя зомби, он initполучает статус выхода и зомби наконец умирает.

unxnut
источник
Так ты хочешь, чтобы я убил init? Из вопроса не ясно, извините, хе-хе, но родитель, кажется, является инициатором :( Я редактировал вопрос.
Сэм Стоилинга
4
Нет, мы хотим, чтобы вы не пытались убить зомби. Вы не можете убить зомби. Этот FAQ так же стар, как и сам Unix.
tripleee
@ Tripleee: Да, это то, что я понял. Может быть, то, что я имею, не зомби. htop не работает и cat / proc / $ pid / cmdline или ls / proc / $ pid / также не работает. Обычно это не происходит с зомби, поэтому я и спросил здесь, это не самая распространенная проблема, imo. Я проверил несколько ответов, которые все говорят вам, чтобы убить родителя, который является init в моем случае или перезагрузить.
Сэм Стоилинга
1
«Убей родителя» - это способ пожинать обычного зомби. Вы не можете убить init. Если зомби перерабатываются под init, вы не можете убить его.
tripleee