Назад | Перейти на главную страницу

Как процесс, застрявший в непрерывном сне, обрабатывается при выходе пользователя из системы?

Я хотел бы спросить о влиянии процесса, застрявшего в состоянии непрерывного сна 'D' в системе Linux, когда пользователь выходит из системы.

Возможно ли завершение сеанса пользователя выходом из системы (а не выключением или перезапуском) даже в случае длительного неубиваемого пользовательского процесса в режиме сна на диске, или система зависнет / выйдет из строя при попытке выхода из системы? Если выход из системы прошел успешно, несмотря на зависший процесс, что произойдет с процессом? Она осиротела и родилась заново? Переходит ли он к следующему сеансу пользователя? Кроме того, если процесс обращался к сегменту разделяемой памяти перед переходом в режим непрерывного сна, что происходит с этой разделяемой памятью и другими процессами, использующими ее? Они тоже пострадали? Как система Linux справляется с такими ситуациями?

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

Прошу прощения, если где-то ранее был дан ответ на подобный вопрос; Я пробовал искать ответы на эти вопросы на различных веб-сайтах и ​​досках сообщений Linux, но большинство страниц, кажется, только объясняют, что такое непрерывный сон и как предотвратить / исправить проблему. Мне не удалось найти никаких ресурсов, объясняющих, что происходит с таким процессом, когда пользовательский сеанс заканчивается без перезагрузки системы. Большинство источников просто рекомендуют перезапустить систему, чтобы избавиться от нее.

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

Я протестировал обработку бесперебойных процессов при выходе из системы с помощью systemd (в Ubuntu) и выскочки (в Chromium OS). Я обнаружил, что самый простой способ заставить произвольный пользовательский процесс перейти в состояние сна 'D' - это поместить его в подсистему cgroup морозильника и изменить freezer.status на FROZEN. (https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) После этого я попытался завершить сеанс пользователя, выйдя из системы. Насколько я могу судить, ожидаемое поведение при выходе из системы как для systemd, так и для Chromium OS заключается в том, что все некорневые процессы должны быть убиты до выхода из диспетчера сеансов.

Что произошло при выходе из системы, так это то, что сеанс пользователя завершился чисто, и в случае Chromium OS, cryptohome, похоже, также отключился без проблем (я не нашел ничего в системных журналах, указывающих на сбой отключения). Как и ожидалось, замороженный процесс пережил выход из системы в обоих случаях и все еще был виден вверху. Он не использовал никаких ресурсов и не был доступен никаким образом после повторного входа в аккаунт. При повторном входе в аккаунт тоже не было проблем или ошибок. Процесс пропал, как только я изменил freezer.status с FROZEN на THAWED. Я не уверен, отличается ли это поведение, когда процесс переходит в состояние «D» по разным причинам, например, блокировка при попытке доступа к NFS и т. Д., Но я ожидал, что результаты будут аналогичными.

Процесс "D" невозможно убить, обычно это устаревший дескриптор файла NFS. Если процесс находится в фоновом режиме, может произойти выход из системы, но это не повлияет на спящий процесс.