Мои задачи systemd onFailure
не удалось запустить, и я вижу это в журнале system
:
: Не удалось поставить в очередь OnFailure = job: Взаимоблокировка ресурсов предотвращена
Каковы возможные причины, которые могут вызвать это сообщение и помешать выполнению моей задачи OnFailure =
?
Я использую systemd v229
Здесь происходит следующее: :Вы запускаете shutdown.target, systemd использует для него режим задания «заменить -безвозвратно». Блок выходит из строя, потому что эта цель конфликтует со всеми остальными блоками и вызывает для них остановку. Между тем, ваш модуль должен выйти из строя, поэтому он запускает OnFailure= unit. Теперь, по умолчанию, это также Conflicts= с shutdown.target, следовательно, вызовет для него остановку. Но, поскольку режим задания был необратимо заменен -, он не может отменить это задание и заменить его, и systemd считает, что это конфликтующая транзакция, поэтому она прерывается. Сбой задания менеджера _добавить _и эта ошибка шины сопоставляется с EDEADLK errno, поэтому вы видите строку предотвращения взаимоблокировки ресурсов.
Это может быть вызвано конфигурацией системы, предназначенной для загрузки системы, выполнения одной задачи и последующего отключения. Служба systemd, которая также содержит сбойную задачу OnFailure=
, может также содержать:
ExecStopPost=/usr/bin/sudo /sbin/poweroff
Существует тупиковая ситуация, в которой для завершения выключения устройства необходимы команды отключения питания. Но чтобы команда poweroff завершила работу, она должна остановить устройство.
Между тем, задание OnFailure=
пытается запуститься, пока возникает тупиковая ситуация.
В конечном счете, кажется, что действие poweroff
вскоре «побеждает» тупиковую ситуацию, а также предотвращает запуск задачи OnFailure=
.
Альтернативным решением для AWS является установка сигнала тревоги CloudWatch для экземпляра. У сигнала тревоги будет опция «Выполнить действие: выключение», если максимальная загрузка ЦП на экземпляре меньше 1% ЦП в течение 15 минут.