Что это такое
ExecStartPre и ExecStartPost - это команды, которые systemd выполняет до и после запуска сервиса.
ExecStartPre=
ExecStart=
ExecStartPost=
Важно: если ExecStartPre вернёт non-zero, то сервис не запустится вообще.
Самая частая ловушка
Pre-хук выглядит безопасным, но падает:
ExecStartPre=/usr/bin/curl http://127.0.0.1:9000/health
Если сервис на 9000 ещё не поднят, curl вернёт код ошибки, systemd считает, что сервис сломан, и даже не дойдёт до ExecStart. Pre-хук выполняется каждый раз при старте, включая рестарты. Любая временная проблема: сеть, DNS, файл, env превращается в стоппер сервиса. В логах:
journalctl -u myservice
ExecStartPre failed with exit code 7
Типичные ошибки:
ExecStartPre=/bin/mkdir /var/run/app
ExecStartPre=/usr/bin/test -f /config/app.yml
ExecStartPre=/usr/bin/psql -c "select 1"
Для post-хуков помни, если ExecStartPost падает, значит сервис уже запущен, но unit помечается как failed.
Практическое правило
ExecStartPre - только для быстрых, гарантированных операций (создать каталог, выставить права, подготовить env). Все, что зависит от сети, БД, других сервисов лучше выносить в код сервиса.
Вывод
ExecStartPre - это точка отказа, если одна команда упала, то сервис не стартует. Если хук может упасть либо гаси ошибку, либо убирай его совсем.
LinuxCamp | #utils
