status=7/NOTRUNNING в systemd
Код 7 означает «программа не работает» и чаще всего приходит не от запуска, а от остановки или перезагрузки настроек: скрипт не нашёл работающий процесс и сообщил об этом. Для systemd это выглядит как неудача, хотя фактически делать было нечего.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Команда остановки выполняется, когда процесса уже нет
Программа упала сама, а затем
ExecStop=попытался её остановить и не нашёл процесса. Итог: служба помечена упавшей из-за завершающей команды, а не из-за исходной проблемы. -
Перезагрузка настроек при остановленной службе
systemctl reloadдля службы, которая не работает, вызываетExecReload=в пустоту — скрипт возвращает 7. -
Служба управляется init-скриптом, который отслеживает pid-файл
Скрипт ищет процесс по pid-файлу. Файл устарел или удалён — скрипт считает, что программа не работает, даже если процесс жив.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает, на каком шаге получен код: запуск, остановка или перезагрузка настроек.
systemctl status myapp.service -l --no-pagerИстория событий: часто видно, что процесс завершился раньше, а код 7 пришёл уже потом.
journalctl -u myapp.service -n 40 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа упала сама, а затем
ExecStop=попытался её остановить и не нашёл процесса. Итог: служба помечена упавшей из-за завершающей команды, а не из-за исходной проблемы.
- Как проверить
-
Посмотрите, какой шаг вернул код: в статусе это строка Process с ExecStop.
systemctl status myapp.service -l --no-pager | grep -E "Process:|Active:"
- Как исправить
-
Сделайте команду остановки терпимой к отсутствию процесса: добавьте дефис перед ней (
ExecStop=-/usr/bin/myapp stop) или используйтеSuccessExitStatus=7, чтобы такой код считался успехом.SuccessExitStatus=7
- Почему происходит
systemctl reloadдля службы, которая не работает, вызываетExecReload=в пустоту — скрипт возвращает 7.
- Как проверить
-
Проверьте состояние службы перед перезагрузкой настроек.
systemctl is-active myapp.service
- Как исправить
-
Используйте
systemctl reload-or-restartвместоreload: остановленная служба будет просто запущена.
- Почему происходит
- Скрипт ищет процесс по pid-файлу. Файл устарел или удалён — скрипт считает, что программа не работает, даже если процесс жив.
- Как проверить
-
Сравните pid-файл с фактическими процессами.
cat /run/myapp.pid 2>/dev/null; ps -ef | grep -v grep | grep myapp
- Как исправить
- Уберите устаревший pid-файл и переведите службу на родной unit-файл без обёртки: systemd следит за процессами сам, без pid-файлов.
Пример вывода
Команда остановки не нашла процесс. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-15 12:22:41 MSK; 3s ago
Process: 10100 ExecStop=/usr/sbin/myapp-wrapper stop (code=exited, status=7/NOTRUNNING)
myapp-wrapper[10100]: myapp is not running
systemd[1]: myapp.service: Control process exited, code=exited, status=7/NOTRUNNING
Связанные ошибки
- status=5/NOTINSTALLED и status=6/NOTCONFIGURED в systemd Коды 5 и 6 по соглашению LSB: программа не установлена или не настроена. Что это значит на практике и как проверить.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Failed with result 'exit-code' Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
- No such process при остановке или сигнале Ошибка 3: процесса с таким номером нет. Разбор для команд остановки и подстановки номера процесса.
- Target is busy: точка монтирования занята Не удаётся отмонтировать: target is busy. Как найти процессы, которые держат точку монтирования, и корректно освободить её.
- signal=INT и signal=QUIT в systemd Процесс службы завершён сигналом INT или QUIT. Кто их посылает службам и почему это обычно не systemd.
- signal=KILL (status=9/KILL) в systemd Процесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
- signal=TERM (status=15/TERM) в systemd Процесс службы завершён сигналом TERM. Когда это нормальная остановка, а когда признак проблемы.
Источники
-
systemd.exec(5)
Класс LSB: код 7 — программа не запущена. -
systemd.service(5)
SuccessExitStatus= и префикс «-» у команд Exec*=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с ExecStop, вызванным после падения процесса.