У меня есть несколько процессов, зависших в состоянии непрерывного сна, все, по-видимому, происходящие из auplink / var / lib / docker / aufs / mnt
. Это что-то, связанное с докером, и он ждет ввода-вывода, который никогда не завершится - я понимаю, но как определить точную причину? Как я могу узнать, какой ввод-вывод он ожидает? Кроме того, действительно ли нет способа удалить эти зависшие процессы без аппаратной перезагрузки?
Вы можете увидеть стек процесса:
cat /proc/<process pid>/stack
, который предоставит вам информацию о том, что он делал, когда оказался в состоянии D.
echo w > /proc/sysrq-trigger; dmesg
сообщит ядру, что нужно сообщить обо всем стеке. трассировки для процессов D-состояния в буфере dmesg.
Процессы в D-состоянии не могут быть уничтожены. Бывают ситуации, когда процесс остается в D-состоянии в течение длительного времени, но иногда завершает ввод-вывод и может быть прерван на короткий период времени, а затем возвращается к той же операции ввода-вывода и снова попадает в D-состояние. Тогда с
while (true); do kill -9 PID; done
есть небольшая вероятность доставки сигнала KILL, пока процесс прерывается.