Подтвердить что ты не робот

Как остановить "бесперебойный" процесс в Linux?

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

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

strace ничего не отображается.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Tanel Poder написал отличный руководство для анализа процессов состояния D. Очень типично, что это состояние вызвано неполным вводом-выводом, например. ошибка сети. slm опубликовал некоторые очень полезные указатели на суперпользователя, чтобы развязать сетевой ввод-вывод, а также о самой проблеме.

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

echo 1 > /sys/block/sr0/delete
echo 1 > /sys/block/sr1/delete
echo "- - -" > /sys/class/scsi_host/host7/scan

Ответ 4

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

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

Ответ 5

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

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

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

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


Edit

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

drop_caches

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

Чтобы освободить pagecache:

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. Это позволит свести к минимуму количество грязных объектов в системе и создать больше кандидатов для отброшен.

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

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

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

cat (1234): drop_caches: 3

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