Процессы вне служб: области и потерянные процессы
Процессы, запущенные не через systemd, попадают в область сеанса, а не в службу. Менеджер их видит, но не управляет: перезапуска, ограничений и журнала у них нет. После выхода из сеанса они обычно завершаются.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Программа запущена из терминала
Так часто «временно» поднимают службу. Процесс живёт в области сеанса и исчезает при выходе или при очистке сеансов.
-
Процесс отвязан от сеанса вручную
Запуск с отвязкой создаёт процесс без хозяина: он не принадлежит ни службе, ни сеансу.
-
Процессы остались после остановки службы
При режиме завершения, оставляющем потомков, процессы продолжают работать вне управления.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Дерево групп: видно, что работает вне служб.
systemd-cgls --no-pager | head -30Процессы и их группы.
ps -eo pid,cgroup,cmd | grep -v systemd | headСеансы: процессы из них завершатся при выходе.
loginctl list-sessionsРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Так часто «временно» поднимают службу. Процесс живёт в области сеанса и исчезает при выходе или при очистке сеансов.
- Как проверить
-
Посмотрите, в какой группе работает процесс.
systemd-cgls --no-pager | grep -B5 myapp | head -12 ps -o pid,cgroup,cmd -p $(pgrep -o myapp)
- Как исправить
-
Переведите программу в службу: создайте unit-файл или запустите через временный unit командой запуска.
sudo systemd-run --unit=myapp-temp /usr/local/bin/myapp
- Почему происходит
- Запуск с отвязкой создаёт процесс без хозяина: он не принадлежит ни службе, ни сеансу.
- Как проверить
-
Посмотрите родителя и группу процесса.
ps -o pid,ppid,cgroup,cmd -p $(pgrep -o myapp)
- Как исправить
- Такие процессы стоит завершить и запустить нормально: без unit они не переживут перезагрузку и не попадут в мониторинг.
- Почему происходит
- При режиме завершения, оставляющем потомков, процессы продолжают работать вне управления.
- Как проверить
-
Посмотрите режим завершения и оставшиеся процессы.
systemctl show myapp.service -p KillMode pgrep -a myapp
- Как исправить
- Смените режим завершения на завершение всей группы, если процессы не должны переживать остановку.
Пример вывода
Программа работает в области сеанса, а не в службе. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemd-cgls --no-pager | grep -A2 "session-42.scope"
└─session-42.scope
├─4100 -bash
└─4180 /usr/local/bin/myapp --serve
$ systemctl status myapp.service
Unit myapp.service could not be found.
Связанные ошибки
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Служба пользователя не запускается или не переживает выход systemctl --user: служба останавливается при выходе из системы. Разбор lingering и отличий от системных служб.
- signal=HUP (status=1/HUP) в systemd Процесс службы завершён сигналом HUP. Обычно это перезагрузка настроек, которую программа поняла как команду выйти.
- No such process при остановке или сигнале Ошибка 3: процесса с таким номером нет. Разбор для команд остановки и подстановки номера процесса.
- Too many tasks: упор в предел TasksMax Служба не может создать новый процесс: достигнут предел TasksMax. Где он задан и как поднять правильно.
- supervisord под systemd: два надзорщика за одними процессами Процессы перезапускаются дважды или не перезапускаются вовсе: systemd и supervisord следят за одним и тем же.
- Служба не занимает имя на шине: оно уже занято Запуск проходит, а обращения идут не туда: второй экземпляр или оставшийся процесс держит имя на шине.
- Служба не создаёт потоки: упор в предел Ошибка создания потока: исчерпан TasksMax или системный предел процессов. Как посчитать нужное значение.
Источники
-
systemd.scope(5)
Области и процессы вне служб. -
systemd-run(1)
Запуск программы во временном unit. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено запуском программы из терминала: она попадает в область сеанса.