SystemdDoctor
ExecStartPre= [Service]

ExecStartPre= и ExecStartPost=: команды до и после запуска

Задаёт команды, которые выполняются до запуска главного процесса (ExecStartPre=) и после того, как служба признана запущенной (ExecStartPost=).

Что делает

Команды выполняются по порядку, и неудача любой из них отменяет запуск службы: главный процесс не будет вызван вовсе. Именно поэтому в статусе иногда видно Control process exited с кодом от проверки конфигурации, а не от самой программы — так устроены unit-файлы nginx и haproxy.

Полезное применение — проверка условий и подготовка: проверить конфигурацию, создать каталог, дождаться доступности зависимости. Не стоит выносить туда долгие операции: они входят в общий таймаут запуска.

Где ставится. В секции [Service], можно указывать несколько строк — выполняются в порядке объявления.

Значения

ЗначениеЧто происходит
ExecStartPre=/usr/sbin/nginx -tпроверка конфигурации: при неудаче служба не запускается.
ExecStartPre=-/bin/rm -f /run/app.lockдефис делает неудачу несущественной: файла может и не быть.
ExecStartPost=/usr/local/bin/notify-deployвыполняется после того, как служба признана запущенной.

Пример

Подготовка каталога и проверка настроек до запуска.

[Service]
ExecStartPre=-/bin/mkdir -p /var/lib/myapp/tmp
ExecStartPre=/usr/local/bin/myapp --check-config
ExecStart=/usr/local/bin/myapp --serve
ExecStartPost=/bin/sh -c 'echo запущено >> /var/log/myapp/deploy.log'

Создание каталогов лучше делать не командой, а параметрами StateDirectory= и RuntimeDirectory=: systemd сделает это сам и с правильным владельцем.

Типичные ошибки

Неудача предварительной команды отменяет запуск целиком. Если команда необязательна, ставьте перед ней дефис.

Долгие предварительные команды съедают таймаут запуска: TimeoutStartSec= считается на всю последовательность.

ExecStartPost= выполняется после признания службы запущенной, а не после её фактической готовности. При Type=simple это почти сразу, и проверять там доступность службы бессмысленно.

В этих командах, как и в ExecStart=, нет оболочки: конвейер требует явного /bin/sh -c.

Связанные ошибки

  • status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
  • Failed with result 'exit-code'Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
  • nginx: [emerg] unknown directivenginx не запускается: неизвестная директива в конфигурации. Опечатка, не тот контекст или отсутствующий модуль.

Рядом стоящие параметры

Где важен на практике

Источники

  • systemd.service(5) официальная документация
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04) собственная проверка
    сверено 15 сентября 2026