service и systemctl
Запуск, остановка и статус служб — systemctl на обычном сервере, service и init-скрипты в контейнере
Служба (демон) — программа, которая работает в фоне: nginx, sshd, cron, postgres. На обычном сервере с Ubuntu ими управляет systemd через команду systemctl. В контейнере systemd обычно не запущен — там работает старая обёртка service, которая вызывает скрипты из /etc/init.d/.
Где что работает
| Окружение | Чем управлять | Как узнать |
|---|---|---|
| Сервер или ВМ с systemd | systemctl, логи — journalctl | cat /proc/1/comm → systemd |
| Контейнер без systemd (как песочница) | service имя действие или /etc/init.d/имя действие | cat /proc/1/comm → bash, sh и т.п. |
| Контейнер с supervisord | supervisorctl | процесс 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-reload | reload, а если не поддерживается — 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).