systemd ExecStopPost не запускается, если ExecStartPre завершается сбоем?

systemd ExecStopPost не запускается, если ExecStartPre завершается сбоем?

Я просмотрел документацию systemdздесьhttps://www.freedesktop.org/software/systemd/man/systemd.service.html.

ExecStartPre=,ExecStartPost=В разделе говорится:

Обратите внимание, что если какая-либо из команд, указанных в ExecStartPre=, ExecStart= или ExecStartPost=, завершается неудачей (и не имеет префикса «-», см. выше) или истекает время ожидания до того, как служба полностью запустится, выполнение продолжается с командами, указанными в ExecStopPost=, команды в ExecStop= пропускаются.

У меня есть ExecStartPreправило:

ExecStartPre=/bin/false

У ExecStopPostменя есть /bin/echo "I'm at ExecStopPost".

Услуга выглядит так

[Unit]
Description=Test

[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"

Когда он запускается и падает, я его никогда не вижу. Вывод из syslog выглядит так

15 июня 20:48:01 ip-10-0-0-246 echo[8687]: Я в ExecStartPre

15 июня 20:48:01 ip-10-0-0-246 systemd[1]: test.service: Процесс управления завершен, код=завершен, статус=1

15 июня 20:48:01 ip-10-0-0-246 systemd[1]: Не удалось запустить тест.

15 июня 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: Устройство перешло в состояние сбоя.

15 июня 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: Ошибка с результатом «код выхода».

Я никогда не вижу своего эха.

journalctl -u test.serviceконечно, это также является его записью.

Мне нужно настроить это немного по-другому? Или мне нужно использовать OnFailure?

Мне нужно иметь возможность перезапускать a Conflicts=в случаях успеха или неудачи. Это будет использоваться в одноразовых сервисах, запускаемых таймерами.

О, и это работает на 16.04.6 LTS.

решение1

Похоже, что oneshotсервисы не вызывают ExecStopPostотказ. Эта ссылка обсуждает этоhttps://bugzilla.redhat.com/show_bug.cgi?id=1353039.

Соответствующий пост

ExecStopPost выполняется только тогда, когда устройство переходит из состояния выполнения (даже если устройство остановлено) или когда Main PID успешно завершает работу в состоянии активации, а служба не относится к типу разветвления.

Разница в том, что в случае службы oneshot во время выполнения настроенных действий ExecStart служба все еще находится в состоянии активации и не запущена. Однако в случае простой службы systemd немедленно переводит службу в состояние выполнения, systemctl не блокируется и возвращается exit 0 даже при сбое ExecStart (т. е. ExecStart=/bin/false). Таким образом, служба oneshot должна завершиться чисто, чтобы вызвать ExecStopPost. AFAICT, опция RemainAfterExit не влияет на ExecStopPost.

Решением в конечном итоге стало добавление OnFailureдля вызова необходимых элементов, которые были бы вызваны вExecStopPost

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