← Весь справочник

service и systemctl

Запуск, остановка и статус служб — systemctl на обычном сервере, service и init-скрипты в контейнере

Служба (демон) — программа, которая работает в фоне: nginx, sshd, cron, postgres. На обычном сервере с Ubuntu ими управляет systemd через команду systemctl. В контейнере systemd обычно не запущен — там работает старая обёртка service, которая вызывает скрипты из /etc/init.d/.

Где что работает

ОкружениеЧем управлятьКак узнать
Сервер или ВМ с systemdsystemctl, логи — journalctlcat /proc/1/comm → systemd
Контейнер без systemd (как песочница)service имя действие или /etc/init.d/имя действиеcat /proc/1/comm → bash, sh и т.п.
Контейнер с supervisordsupervisorctlпроцесс supervisord в ps

В песочнице systemctl установлен, но не работает:

systemctl status cron
# System has not been booted with systemd as init system (PID 1). Can't operate.
# Failed to connect to bus: Host is down

На машине с systemd команда service сама перенаправляет вызов в systemctl, поэтому service nginx restart работает и там.

service

service имя действие
service --status-all
КомандаЧто делает
service имя start / stopзапустить / остановить
service имя restartостановить и запустить заново
service имя reloadперечитать конфиг без остановки (если служба умеет)
service имя force-reloadreload, а если не поддерживается — restart
service имя statusработает ли; код 0 — работает, 3 — не работает
service имябез действия — подсказка со списком поддерживаемых действий
service --status-allвсе init-скрипты: [ + ] — работает, [ - ] — нет, [ ? ] — скрипт не умеет status

Список действий зависит от скрипта: у nginx есть ещё configtest, rotate, upgrade. /etc/init.d/имя действие делает то же самое напрямую.

systemctl (на сервере с systemd)

КомандаЧто делает
systemctl start / stop / restart юнитзапустить / остановить / перезапустить сейчас
systemctl reload юнитперечитать конфиг без перезапуска
systemctl reload-or-restart юнитreload, если поддерживается, иначе restart
systemctl status юнитсостояние, PID, память, последние строки лога
systemctl enable юнит / disableвключить / выключить автозапуск при загрузке (не запускает сейчас)
systemctl enable --now юнитвключить автозапуск и сразу запустить
systemctl is-active / is-enabled / is-failed юниткороткий ответ и код возврата — для скриптов
systemctl mask / unmask юнитзапретить запуск совсем, даже вручную и как зависимость
systemctl daemon-reloadперечитать unit-файлы после их правки
systemctl cat юнитпоказать unit-файл со всеми дополнениями
systemctl edit юнитсоздать override-файл (/etc/systemd/system/юнит.d/override.conf)
systemctl list-units --type=serviceзагруженные службы и их состояние
systemctl --failedупавшие юниты
systemctl list-timersтаймеры — замена cron в systemd
journalctl -u юнитлог службы; -f — следить, -n 50 — последние 50 строк, --since "1 hour ago"

Имя юнита можно писать без .service: systemctl restart nginx.

Состояния в systemctl status: active (running) — работает, inactive (dead) — остановлен, failed — упал или завершился с ошибкой, activating — запускается. Строка Loaded: показывает путь к unit-файлу и enabled/disabled — включён ли автозапуск.

supervisorctl

КомандаЧто делает
supervisorctl statusвсе программы и их состояние (RUNNING, STOPPED, FATAL, BACKOFF)
supervisorctl start / stop / restart имяуправление программой; all — всеми
supervisorctl rereadперечитать конфиги и показать, что изменилось
supervisorctl updateприменить изменения: запустить новые программы, перезапустить изменённые
supervisorctl tail -f имявывод программы

Конфиги программ лежат в /etc/supervisor/conf.d/*.conf (секция [program:имя]), а сам supervisord запускается через service supervisor start.

Примеры

# что вообще есть и что запущено
service --status-all

# запустить cron и проверить
service cron start
service cron status

# проверить конфиг nginx и мягко применить
service nginx configtest && service nginx reload

# в скрипте: запущена ли служба
if service nginx status >/dev/null; then echo "работает"; fi

# напрямую через init-скрипт
/etc/init.d/ssh restart

# supervisord: добавить программу и применить
service supervisor start
supervisorctl reread && supervisorctl update
supervisorctl status

# на сервере с systemd
systemctl enable --now nginx
systemctl status nginx
journalctl -u nginx -n 50 --no-pager
systemctl daemon-reload && systemctl restart myapp

Подводные камни

  • systemctl в контейнере не работает, даже если установлен: ему нужен systemd в роли PID 1. Ошибка «System has not been booted with systemd» — это не поломка службы, а сигнал использовать service.
  • enable не запускает службу, а start не включает автозапуск. На сервере после установки обычно нужны оба: systemctl enable --now.
  • После правки unit-файла нужен daemon-reload, иначе systemd продолжит использовать старую версию.
  • reload не всё перечитывает. Например, смену порта или пользователя некоторые демоны применяют только после restart.
  • В контейнере нет автозапуска. service x start действует до перезапуска контейнера; ссылки в /etc/rc*.d никто не читает.
  • service … status у разных скриптов печатает по-разному. В скриптах опирайся на код возврата, а не на текст.
  • Если служба не стартует, сначала смотри её лог: /var/log/<служба>/… в контейнере, journalctl -u на сервере. Частая причина — ошибка в конфиге или занятый порт (ss -ltnp).

См. также

kill · ps · cron · nginx · ss