KillMode= в systemd: какие процессы останавливаются вместе со службой
Определяет, какие процессы systemd завершает при остановке службы: все процессы её контрольной группы, только главный процесс или никого.
Что делает
Значение по умолчанию control-group — самое предсказуемое: останавливается всё, что служба породила. Именно это отличает systemd от старых init-скриптов, где «осиротевшие» процессы оставались жить и мешали следующему запуску.
Значения process и особенно none оставляют процессы работать после остановки службы. Иногда это нужно (Docker оставляет контейнеры работать при обновлении демона), но чаще приводит к занятому порту при следующем запуске и к процессам без хозяина.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
control-group | по умолчанию: завершаются все процессы контрольной группы службы. |
mixed | сигнал завершения — только главному процессу, а KILL по таймауту — всей группе. |
process | завершается только главный процесс; остальные продолжают работать. |
none | ничего не завершается. Объявлено устаревшим и оставлено для особых случаев. |
По умолчанию: control-group
Пример
Служба, чьи дочерние процессы должны переживать перезапуск демона.
[Service]
KillMode=process
ExecStart=/usr/bin/dockerd
# при остановке демона контейнеры продолжают работать
Это осознанное исключение. Для обычных служб такое значение приводит к процессам без хозяина и к занятому порту при следующем запуске.
Типичные ошибки
KillMode=none оставляет процессы работать после остановки: следующий запуск упрётся в занятый порт, а старые процессы придётся искать вручную.
При process и mixed дочерние процессы, не завершившиеся сами, останутся в системе.
Если служба порождает процессы через оболочку, при process завершится только оболочка, а работа продолжится.
Связанные ошибки
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- signal=KILL (status=9/KILL) в systemdПроцесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
- signal=INT и signal=QUIT в systemdПроцесс службы завершён сигналом INT или QUIT. Кто их посылает службам и почему это обычно не systemd.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.kill(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)