Каковы возможные причины ошибки systemd «Не удалось поставить задание OnFailure= в очередь: устранена взаимоблокировка ресурсов»?

Каковы возможные причины ошибки systemd «Не удалось поставить задание OnFailure= в очередь: устранена взаимоблокировка ресурсов»?

Мои onFailureзадачи systemd не удалось выполнить, и я вижу это в systemжурнале:

: Не удалось поставить в очередь задание OnFailure=: Избежано взаимоблокировки ресурсов

Каковы возможные причины, которые могут вызвать это сообщение и помешать OnFailure=выполнению моей задачи?

Я использую systemd v229

решение1

Вот что именно здесь происходит: вы запускаете shutdown.target, systemd использует для него режим задания 'replace-irreversibly'. Блок выходит из строя, потому что этот целевой блок конфликтует со всеми остальными блоками, и запускает для них остановку. Между тем, ваш блок должен был выйти из строя, поэтому он запускает OnFailure= unit. Теперь по умолчанию это тоже Conflicts= с shutdown.target, поэтому для него будет запущена остановка. Но, поскольку режим задания был replace-irreversibly, он не может отменить это задание и заменить его, и systemd считает, что это конфликтующая транзакция, поэтому она прерывается. manager_add_job завершается сбоем, и эта ошибка шины отображается на EDEADLK errno, поэтому вы видите строку Resource deadlock Avoided.

решение2

Это может быть вызвано в конфигурации системы, которая разработана для загрузки системы, запуска одной задачи и последующего выключения. Служба systemd, которая также содержит неисправную OnFailure=задачу, может также содержать:

ExecStopPost=/usr/bin/sudo /sbin/poweroff

Взаимная блокировка возникает в том, что для завершения выключения устройства необходимо выполнить команды poweroff. Но для завершения выполнения команды poweroff необходимо остановить устройство.

Тем временем OnFailure=задание пытается запуститься, пока происходит эта взаимоблокировка.

В конечном итоге действие, по-видимому, poweroffвскоре «выходит» из тупика, также предотвращая OnFailure=выполнение задачи.

Альтернативное решение на AWS — установить сигнализацию CloudWatch на экземпляре. Сигнализация будет иметь опцию «Take Action: Shutdown», если Max CPU на экземпляре будет менее 1% CPU в течение 15 минут.

Связанный контент