Что такое «остановка», как в «Работе остановки…»?


30

После выдачи команды выключения иногда появляется сообщение о состоянии, подобное этому:

A stop job is running for Session 1 of user xy

и затем система зависает на некоторое время или навсегда в зависимости от ???

Так что же такое «остановка работы»?

Кроме того, почему он иногда оценивает время, которое он займет, довольно точно, а иногда он может работать вечно?


2
Может быть, стоит прекратить работу? Сеанс остановил задания, которые на самом деле не выполняются, и поэтому не имеют возможности отвечать на сигналы завершения.
Каз

Оболочка отладки F9 искажена сообщением "Stop Job"? убери
цилиндр

Ответы:


28

systemd работает внутри с точки зрения очереди «заданий». Каждое задание (немного упрощенное) - это действие, которое необходимо выполнить: остановить, проверить, запустить или перезапустить определенный модуль .

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

Затем он пытается выполнить поставленные в очередь «задания».

Задание остановки выполняется для сеанса 1 пользователя xy

Блок отображаемое имя здесь Session 1 of user xy. Это будет (из отображаемого имени) единица сеанса , а не единица обслуживания . Это абстракция сеанса входа в пользовательское пространство, которая поддерживается программой systemd logindи ее плагинами PAM. Это (по сути и в теории) группировка всех процессов, которые этот пользователь выполняет как «сеанс входа в систему».

Работа, которая была поставлена ​​в очередь на это stop. И это, вероятно, занимает много времени, потому что системные пользователи ошибочно связывают зависание сеанса с отключением сеанса . Они ломают первое, чтобы заставить второе работать, и в ответ некоторые люди изменяют systemd, чтобы сломать второе, чтобы заставить первое работать. Системные люди действительно должны признать, что это две разные вещи.

В сеансе входа в систему у вас есть что-то, что игнорируется SIGTERMили требует много времени для завершения, как только оно увидит SIGTERM. По иронии судьбы, первое - это давнее поведение некоторых оболочек контроля работы. Правильный способ прервать лидеров сеансов входа в систему, когда они являются этими конкретными оболочками управления заданиями, - это сказать им, что сеанс завис , после чего они прекращают все свои задания (другой тип задания для внутреннего задания systemd), а затем прекратить себя.

На самом деле происходит то, что systemd ожидает время ожидания остановки устройства, пока оно не прибегнет к SIGKILL. Разумеется, этот тайм-аут настраивается на единицу и может быть установлен так, чтобы он никогда не превышался. Следовательно, почему можно увидеть различное поведение.

дальнейшее чтение


1
Согласно этому ответу, unix.stackexchange.com/a/297318/224025 мы можем изменить это время. Будет ли это безопасно (или принесет какой-либо вред), если я изменю его на ноль секунд?
GypsyCosmonaut

1
На самом деле, последний абзац этого ответа и руководство пользователя, на которое я укажу вас для дальнейшего чтения, уже сообщают вам об изменении времени ожидания. Вопрос о том, что означает тайм-аут 0s и является ли его безопасным для использования, следует задавать в виде вопроса в разделе «Как спросить», потому что это дополнительный вопрос к вопросу о том, что такое «прекращение работы» и почему время ожидания варьируется. Я подозреваю, что это может быть хорошим.
JdeBP

2

Эти сообщения от systemd, который является системой инициализации, которая запускает и останавливает задания. Задания могут быть демонами, но также могут выполнять небольшие задачи, такие как монтирование и размонтирование дисков, удаление / tmp или сохранение и восстановление яркости экрана при загрузке. systemctl list-unitsдает вам идею. Systemd использует «unit» и «job», чтобы обозначать одно и то же.

Когда задание останавливается, как, например systemctl stop ..., с вопросом, то как долго ждать завершения задания, прежде чем объявить об ошибке и завершить процессы задания с помощью SIGKILLсигнала. Мы действительно не хотим использовать, SIGKILLесли не обязаны, так как это не дает возможности для чистого завершения процесса. Для некоторых процессов может потребоваться несколько секунд, чтобы объявить о сбое, для других процессов, таких как база данных, может потребоваться существенный сетевой и дисковый ввод-вывод для чистой остановки работы, и поэтому мы можем дать этим модулям несколько минут на чистое завершение работы ,

То, что вы видите при выключении, эквивалентно тому, systemctl stop $UNIT_NAMEчто для запуска требуется некоторое время. Имеется счетчик, показывающий прошедшие секунды и максимальное время ожидания, по истечении которого SIGKILL будет выдан, и отключение будет продолжаться независимо от этого.

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


«В Systemd слова« unit »и« job »означают одно и то же». Я не думаю, что это правда: грубо говоря, «работа» - это просьба сделать что-то для «подразделения». Смотрите ответ @ JdeBP для деталей.
Томас,

1

Некоторая служба зависла, и systemd ожидает ее завершения. Systemd, вероятно, не точно оценивает время, которое потребуется, обычно время (обычно 90 секунд) - это то, сколько времени systemd будет ждать, пока у него не хватит терпения. Смотрите этот пост:

Задание остановки выполняется для сеанса c2 пользователя


6
Как я могу выяснить, какой сервис зависает?
naitsirch

-1

«Остановить задания» - это когда systemdожидание остановки определенной «работы», например, некоторый процесс, который он ожидает завершить, прежде чем продолжить. Если вы видите предупреждающее сообщение, что «выполняется остановка задания ...» (и т. Д.), Это технически означает, что что-то ожидает в очереди заданий.

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

Например: мы получали сообщения, связанные с «прекращением работы», и не могли понять, почему… оказывается, на диске почти не осталось места, и ОС начала странно себя вести.

Обновление сервера до диска большего размера и перезагрузка исправили это;)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.