status=0/SUCCESS, но служба считается упавшей
Код 0 значит успех, и всё же служба выглядит остановленной или упавшей. Так бывает, когда systemd и программа по-разному понимают, что такое «работать»: программа ушла в фон и завершила исходный процесс, а systemd счёл это завершением службы.
Что это значит
systemd следит за главным процессом службы. Если тот завершился с нулём, при Type=simple служба переходит в состояние inactive (dead) — успешно, но не работает. А при Type=forking без PIDFile= systemd может потерять настоящий процесс и решить, что служба упала.
Отсюда правило: старый init-скрипт, который сам уходил в фон, нельзя переносить в unit-файл дословно. Либо отключайте демонизацию у программы и берите Type=simple, либо оставляйте её и честно объявляйте Type=forking с PIDFile=.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Программа демонизируется, а в unit-файле
Type=simpleИсходный процесс создаёт дочерний и завершается. systemd видит успешный выход главного процесса и считает службу отработавшей.
-
Одноразовая задача без
RemainAfterExit=Для
Type=oneshotзавершение — это норма. Служба уходит в inactive (dead), и если её опрашивает мониторинг как «должна быть active», он поднимет тревогу на ровном месте. -
Служба завершает работу, потому что ей нечего делать
Программа считает, что всё сделано: не нашла работы, отработала одну итерацию, вышла по настройке. Код нулевой, претензий у systemd нет — но служба не работает.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Четыре параметра, которые вместе определяют, как systemd понимает жизнь службы.
systemctl show myapp.service -p Type -p RemainAfterExit -p PIDFile -p GuessMainPIDПоказывает состояние и подстояние: «inactive (dead)» и «active (exited)» значат разное.
systemctl status myapp.service -l --no-pagerДерево процессов: видно, работает ли программа на самом деле, потеряв связь с systemd.
ps -ef --forest | grep -A3 myappРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
Type=simple- Почему происходит
- Исходный процесс создаёт дочерний и завершается. systemd видит успешный выход главного процесса и считает службу отработавшей.
- Как проверить
-
Посмотрите тип и наличие флага демонизации в команде запуска.
systemctl cat myapp.service | grep -E "Type=|ExecStart=" ps -ef | grep -v grep | grep myapp
- Как исправить
-
Уберите демонизацию: почти у всех служб есть ключ «не уходить в фон» (
-g "daemon off;"у nginx,--foreground,-D FOREGROUND). Если убрать нельзя, поставьтеType=forkingиPIDFile=.Type=simple ExecStart=/usr/sbin/myapp --foreground
RemainAfterExit=- Почему происходит
- Для
Type=oneshotзавершение — это норма. Служба уходит в inactive (dead), и если её опрашивает мониторинг как «должна быть active», он поднимет тревогу на ровном месте.
- Как проверить
-
Посмотрите тип и параметр сохранения состояния.
systemctl show myapp.service -p Type -p RemainAfterExit
- Как исправить
-
Добавьте
RemainAfterExit=yes: после успешного выполнения служба останется в состоянии active (exited), и это будет честно отражать «задача выполнена».
- Почему происходит
- Программа считает, что всё сделано: не нашла работы, отработала одну итерацию, вышла по настройке. Код нулевой, претензий у systemd нет — но служба не работает.
- Как проверить
-
Посмотрите её сообщения перед выходом.
journalctl -u myapp.service -n 50 --no-pager
- Как исправить
- Настройте программу на постоянную работу или запускайте её по расписанию таймером, если она по смыслу одноразовая.
Пример вывода
Демонизирующаяся программа при Type=simple. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
○ myapp.service - My application
Loaded: loaded (/etc/systemd/system/myapp.service; enabled; preset: enabled)
Active: inactive (dead) since Mon 2026-09-15 11:02:31 MSK; 5s ago
Process: 8100 ExecStart=/usr/sbin/myapp --daemon (code=exited, status=0/SUCCESS)
Main PID: 8100 (code=exited, status=0/SUCCESS)
systemd[1]: myapp.service: Deactivated successfully.
Обратите внимание на кружок вместо крестика и на «Deactivated successfully»: с точки зрения systemd ошибки не было вовсе.
Частые вопросы
Почему `systemctl start` возвращает успех, а служба не работает?
Потому что запуск действительно прошёл: программа стартовала и завершилась с нулём. Проверять надо не код команды, а состояние Active и подстояние в systemctl status.
Связанные ошибки
- Failed with result 'exit-code' Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Redis: служба сразу останавливается из-за daemonize yes Redis уходит в фон сам, systemd теряет процесс и считает службу отработавшей. Как настроить правильно.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
-
systemd.service(5)
Type=simple, forking, oneshot и RemainAfterExit=: как systemd определяет, что служба работает. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с демонизирующейся программой и на oneshot без RemainAfterExit.