Я просмотрел документацию 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