Как остановить «бесперебойный» процесс в Linux? - PullRequest
38 голосов
/ 20 апреля 2009

У меня висит процесс VirtualBox, который я пытался убить (-KILL / -ABORT), но безуспешно. Родительский pid равен 1 (init).

top показывает процесс как D, который задокументирован как «непрерывный сон».

strace ничего не показывает.

Как мне от этого избавиться? Это не позволяет мне выгрузить драйвер ядра vbox для загрузки более нового.

Ответы [ 5 ]

42 голосов
/ 20 апреля 2009

Простой ответ: вы не можете.

Более длинный ответ: непрерывный сон означает, что процесс не будет разбужен сигналами. Это может быть только разбужено тем, что это ждет. Когда я получаю такие ситуации, например. с помощью CD-ROM я обычно перезагружаю компьютер, используя метод suspend-to-disk и возобновляя работу.

17 голосов
/ 22 ноября 2015

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

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

Лично, когда я имею дело с Windows на VirtualBox и даже с Wine, я часто сталкиваюсь с этой проблемой из-за ввода-вывода cdrom, который никогда не завершается (я полагаю, это своего рода проверка наличия диска). Устройства ATA могут быть сброшены , что, вероятно, приведет к отмене процесса. Например, я использую следующий небольшой скрипт для сброса обоих моих оптических приводов, чтобы не блокировать процессы, которые они блокируют:

echo 1 > /sys/block/sr0/delete
echo 1 > /sys/block/sr1/delete
echo "- - -" > /sys/class/scsi_host/host7/scan
17 голосов
/ 20 апреля 2009

Состояние D в основном означает, что процесс ожидает дискового ввода-вывода или другого блочного ввода-вывода, который не может быть прерван. Иногда это означает, что ядро ​​или устройство лихорадочно пытается прочитать плохой блок (особенно с оптического диска). Иногда это означает, что есть что-то еще.

Процесс нельзя остановить, пока он не выйдет из состояния D. Узнайте, чего он ждет, и исправьте это. Самый простой способ - это перезагрузить компьютер. Иногда удаление указанного диска помогает, но это может быть довольно опасно: нефиксированный катастрофический сбой оборудования, если вы не знаете, что делаете (читай: дым выходит).

3 голосов
/ 29 августа 2013

Недавно я столкнулся с процессом в состоянии D на удаленном сервере и хотел бы уточнить, что для удаления процесса необходима жесткая перезагрузка или цикл питания.

Не пытайтесь выполнить мягкую перезагрузку, пока не исчерпаете все остальные параметры. Например, вы можете попробовать освободить любой ресурс, на котором висит процесс. Мягкая перезагрузка может дать вам систему, которая частично выключена и больше не будет отвечать на ssh, но не будет перезагружаться, потому что зависает, пытаясь завершить непрерывный процесс.

1 голос
/ 16 августа 2017

Как уже говорили другие, непрерывный процесс - это процесс, который застрял в функции ядра и не может быть прерван (обычно он ожидает какой-либо операции ввода-вывода). См. этот ответ для подробного описания.

Помимо перезагрузки компьютера, мне удалось вывести некоторые процессы из состояния D путем очистки виртуальных кешей Linux * :

kill -9 {process_id}
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

Похоже, это не повлияло на стабильность системы, но я не системный программист и не уверен, какие непредвиденные последствия это может иметь.


Редактировать

Согласно документам ядра , drop_caches представляется достаточно безопасным в среде разработки.

drop_caches

Запись этого приведет к тому, что ядро ​​сбросит чистые кэши, а также восстанавливаемые плиты, такие как зубные камни и иноды. Однажды упав, их память становится свободной.

Для бесплатного кэша страниц:

echo 1 > /proc/sys/vm/drop_caches

Чтобы освободить исправимые объекты плиты (включая зубные камни и иноды):

echo 2 > /proc/sys/vm/drop_caches

Чтобы освободить объекты slab и Pagecache:

echo 3 > /proc/sys/vm/drop_caches

Это неразрушающая операция, которая не освобождает грязные предметы. Чтобы увеличить количество объектов, освобожденных этой операцией, пользователь может запустить `sync 'перед записью в / proc / sys / vm / drop_caches. Это сведет к минимуму количество грязных объектов в системе и создать больше кандидатов на отброшен.

Этот файл не является средством контроля роста различных кэшей ядра. (inode, dentries, pagecache и т. д.). Эти объекты автоматически восстанавливается ядром, когда требуется память в другом месте системы.

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

Вы можете увидеть информационные сообщения в журнале вашего ядра, когда этот файл используется:

cat (1234): drop_caches: 3

Это только для информации. Они не означают, что что-то не так с вашей системой. Чтобы отключить их, введите 4 (бит 3) в drop_caches.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...