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

Что могло привести к остановке службы systemd и отмене задания?

Иногда при остановке службы systemd с помощью systemctl stop test-server он не сможет указать, что задание было отменено:

Unable to stop service test-server: Job for test-server.service canceled.

Что могло привести к отмене остановки услуги?

Примечание. Остановка фактически инициируется из пьесы Ansible, но не могу понять, как это будет связано.

Каждый модуль в systemd имеет внутренний слот задания, и одновременно для этого модуля может быть установлено только одно задание. Задания инкапсулируют запросы на изменение состояния для модулей в целом, но их эффекты зависят от типа модуля. В службах они могут инициировать запрос на изменение состояния, но действие может выполняться, даже если вы отмените установленное задание (или отмените и замените его другим типом задания, которое будет держать другое задание в состоянии ожидания до завершения этой операции, поскольку Внутренние функции unit_start / stop также могут решить, когда определенное задание будет запущено).

В качестве иллюстрации, если у вас есть действие остановки, которое занимает много времени, то вызов start во время выполнения задания остановки приведет к тому, что режим задания по умолчанию (замена) отменит установленное / запущенное задание остановки и установит задание запуска в блоке слот работы. Поскольку unit_stop ранее инициировал переход к деактивации (и все, что соответствует внутреннему подсостоянию службы - stop, stop-sigterm, stop-sigkill, stop-final, stop-final-sigterm, stop-final-sigkill), unit_start теперь будет return -EAGAIN, что заставляет systemd переводить стартовое задание в состояние JOB_WAITING, и при следующем изменении состояния оно будет добавлено в очередь выполнения, проверено, можно ли снова запустить, и, в зависимости от результата, будет запущено или снова помещено в ожидание (с unit_notify). Каждый раз, когда задание выполняется, оно удаляется из очереди выполнения. По сути, именно поэтому systemctl start все это время будет просто ждать (если вы не используете --no-block).

Это был обзор некоторых движущихся частей. При работе с заданиями следует помнить о трех вещах: у них есть тип (запуск, остановка, перезапуск, перезагрузка и т. Д.), Результат (тайм-аут, выполнено, отменено, зависимость, пропущено и т. Д.) И режим (заменить, изолировать, промывка и т. д.). Режимы применяются ко всей транзакции (запрошенное задание и его требования, а также связанные с распространением задания применяются вместе согласованным образом), есть документация о том, что каждое из них делает.

В вашем конкретном случае кажется, что когда вы выполняете остановку systemctl, приходит другое задание и заменяет ваше задание остановки, а клиент systemctl отключается, поскольку задание, которое он поставил в очередь, было отменено. Это может быть из-за какой-то зависимости или чего-то еще (например, ExecStop = завершает вызов systemctl start unit (который работает только в первый раз) или что-то подобное, или модуль, который хочет / требует / связывает тот же модуль, запускающий запуск задание, которое заменяет запущенное вами задание остановки и т. д.). Это может быть служба, которая активирована сокетом и повторно запускается из-за занятого соединения, ставит в очередь задание запуска из-за зависимости Triggers = в модуле сокета, отменяя задание остановки. Это также может быть таймер или что-то еще: короче говоря, остановленное задание заменяется другим заданием, пришедшим и заменившим его.

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

В моем случае я получил

[root@server:~]# systemctl start nginx
Job for nginx.service canceled.

Причина в том, что я определил nginx как BindsTo= иметь другую службу, чтобы она работала точно тогда, когда работает эта другая служба.

Из-за ошибки в один прекрасный день другая служба начала немедленно завершать работу, из-за чего systemd отменила задание запуска nginx.

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