Мои 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 минут.