SystemdDoctor
мешает работе частое type демонизация oneshot

status=0/SUCCESS, но служба считается упавшей

Код 0 значит успех, и всё же служба выглядит остановленной или упавшей. Так бывает, когда systemd и программа по-разному понимают, что такое «работать»: программа ушла в фон и завершила исходный процесс, а systemd счёл это завершением службы.

Что это значит

systemd следит за главным процессом службы. Если тот завершился с нулём, при Type=simple служба переходит в состояние inactive (dead) — успешно, но не работает. А при Type=forking без PIDFile= systemd может потерять настоящий процесс и решить, что служба упала.

Отсюда правило: старый init-скрипт, который сам уходил в фон, нельзя переносить в unit-файл дословно. Либо отключайте демонизацию у программы и берите Type=simple, либо оставляйте её и честно объявляйте Type=forking с PIDFile=.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Программа демонизируется, а в unit-файле Type=simple

    Исходный процесс создаёт дочерний и завершается. systemd видит успешный выход главного процесса и считает службу отработавшей.

  2. Одноразовая задача без RemainAfterExit=

    Для Type=oneshot завершение — это норма. Служба уходит в inactive (dead), и если её опрашивает мониторинг как «должна быть active», он поднимет тревогу на ровном месте.

  3. Служба завершает работу, потому что ей нечего делать

    Программа считает, что всё сделано: не нашла работы, отработала одну итерацию, вышла по настройке. Код нулевой, претензий у 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

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Программа демонизируется, а в unit-файле 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
2. Одноразовая задача без RemainAfterExit=
Почему происходит
Для Type=oneshot завершение — это норма. Служба уходит в inactive (dead), и если её опрашивает мониторинг как «должна быть active», он поднимет тревогу на ровном месте.
Как проверить
Посмотрите тип и параметр сохранения состояния.
systemctl show myapp.service -p Type -p RemainAfterExit
Как исправить
Добавьте RemainAfterExit=yes: после успешного выполнения служба останется в состоянии active (exited), и это будет честно отражать «задача выполнена».
3. Служба завершает работу, потому что ей нечего делать
Почему происходит
Программа считает, что всё сделано: не нашла работы, отработала одну итерацию, вышла по настройке. Код нулевой, претензий у 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.

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

Где встречается чаще всего

Источники

  • systemd.service(5)
    Type=simple, forking, oneshot и RemainAfterExit=: как systemd определяет, что служба работает.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на unit с демонизирующейся программой и на oneshot без RemainAfterExit.
    собственная проверка, systemd 255
    сверено 15 сентября 2026