Введение / Зачем это нужно
Хотя systemd стал де-факто стандартом для большинства дистрибутивов Linux, существуют популярные и стабильные альтернативы, такие как SysVinit, OpenRC и runit. Этот гайд поможет вам освоить управление сервисами в таких средах. Вы научитесь запускать, останавливать, добавлять в автозагрузку и создавать собственные скрипты для управления службами, что особенно актуально для Alpine Linux, Gentoo, Void Linux и специализированных сборок Debian/Ubuntu без systemd.
Требования / Подготовка
- Доступ к терминалу Linux с правами sudo (или root).
- Базовое понимание командной строки и структуры каталогов
/etc/. - Установленный текстовый редактор (
nano,vim). - Знание, какая система инициализации используется в вашем дистрибутиве (см. первый шаг).
Шаг 1: Определите текущую систему инициализации
Перед началом необходимо понять, какая init-система управляет процессами на вашей системе. Это ключевой шаг, так как команды для SysVinit и OpenRC различаются.
Выполните следующие команды:
# Способ 1: Посмотреть, какой процесс имеет PID 1 (это и есть init-система)
ps -p 1 -o comm=
# Способ 2: Проверить тип символьной ссылки /sbin/init
ls -l /sbin/init
# Способ 3: Для OpenRC часто есть файл /etc/openrc/conf.d
# или наличие каталога /etc/runlevels/
ls /etc/runlevels/ 2>/dev/null && echo "Возможно, OpenRC"
Ожидаемые результаты:
initилиsysvinit→ используется SysVinit.openrcилиrunit→ используется OpenRC или runit соответственно.systemd→ у вас systemd, и этот гайд не применим.
Шаг 2: Управление сервисами в SysVinit
SysVinit — классическая система, использующая скрипты в /etc/init.d/ и управление через команды service и chkconfig (или update-rc.d в Debian-семействе).
2.1. Базовые операции с сервисом
# Запуск сервиса (пример для nginx)
sudo service nginx start
# Остановка сервиса
sudo service nginx stop
# Перезапуск
sudo service nginx restart
# Проверка статуса (в некоторых системах)
sudo service nginx status
# Принудительная перезагрузка конфигурации (если поддерживается)
sudo service nginx reload
2.2. Управление автозагрузкой
В SysVinit автозагрузка управляется через символьные ссылки в каталогах runlevel (/etc/rc.d/rc?.d/ или /etc/rc?.d/).
Для Red Hat, CentOS, Fedora (используется chkconfig):
# Добавить сервис в автозагрузку для уровней 2,3,4,5
sudo chkconfig nginx on
# Удалить из автозагрузки
sudo chkconfig nginx off
# Посмотреть, в каких runlevel'ах включен сервис
sudo chkconfig --list nginx
Для Debian, Ubuntu (используется update-rc.d):
# Добавить в автозагрузку (по умолчанию для уровней 2,3,4,5)
sudo update-rc.d nginx defaults
# Удалить из автозагрузки
sudo update-rc.d -f nginx remove
# Явное указание runlevel'ов (например, 2,3,4,5)
sudo update-rc.d nginx start 20 2 3 4 5 . stop 80 0 1 6 .
Шаг 3: Управление сервисами в OpenRC
OpenRC — зависимая от runlevel система, популярная в Alpine Linux и Gentoo. Основные команды: rc-service и rc-update.
3.1. Базовые операции с сервисом
# Запуск сервиса
sudo rc-service nginx start
# Остановка
sudo rc-service nginx stop
# Перезапуск
sudo rc-service nginx restart
# Проверка статуса
sudo rc-service nginx status
# Получить список всех сервисов и их статус
rc-status --all
3.2. Управление автозагрузкой (runlevel)
В OpenRC сервисы добавляются в runlevel (уровень загрузки), например, default (аналог multi-user.target) или nonetwork.
# Добавить сервис в runlevel 'default' (автозапуск при обычной загрузке)
sudo rc-update add nginx default
# Удалить сервис из runlevel
sudo rc-update del nginx default
# Посмотреть, какие сервисы добавлены в runlevel 'default'
rc-update show default
# Список всех доступных runlevel'ов
rc-update -v
Шаг 4: Создание и настройка собственного init-скрипта
Иногда нужно создать скрипт для собственного приложения. Пример для SysVinit (логика для OpenRC очень похожа, но есть нюансы в заголовке скрипта).
- Создайте файл скрипта в
/etc/init.d/:sudo nano /etc/init.d/myapp - Добавьте следующее содержимое (адаптируйте под ваше приложение):
#!/sbin/runscript # Copyright (c) 2026 FixPedia Team # Имя сервиса description="Мой кастомный сервис" # Команда запуска (путь к бинарнику или скрипту) command="/usr/local/bin/myapp" # Опции команды command_args="--config /etc/myapp/config.conf" # Пользователь, от которого запускать (опционально) # user="myuser" # PID-файл (если приложение пишет свой PID) # pidfile="/run/myapp.pid" depend() { # Указать зависимости, например, от сети или каталога # need net # use dns } start() { ebegin "Запуск MyApp" start-stop-daemon --start --exec $command -- $command_args eend $? } stop() { ebegin "Остановка MyApp" start-stop-daemon --stop --exec $command --retry=TERM/30/KILL/5 eend $? }
Для OpenRC скрипт начинается с#!/sbin/runscript, но функцииstart()/stop()пишутся безstart-stop-daemon, а с прямым вызовом$command. Детали смотрите вman openrc-run. - Сделайте скрипт исполняемым:
sudo chmod +x /etc/init.d/myapp - Для SysVinit: добавьте в автозагрузку (см. Шаг 2.2). Для OpenRC: добавьте в runlevel (см. Шаг 3.2).
Шаг 5: Проверка статуса и логов
После настройки сервиса важно убедиться, что он работает корректно.
# Для SysVinit
sudo service myapp status
# Или проверьте процесс
ps aux | grep myapp
# Для OpenRC
sudo rc-service myapp status
rc-status
# Просмотр логов (зависит от конфигурации syslog)
sudo tail -f /var/log/syslog
# Или /var/log/messages, /var/log/daemon.log
# Если используется systemd-journald как логгер (возможно в гибридных системах)
sudo journalctl -u myapp -f
Возможные проблемы
- Ошибка "permission denied" при запуске скрипта: Убедитесь, что скрипт в
/etc/init.d/имеет права на исполнение (chmod +x). Проверьте права на исполняемый файл сервиса. - Сервис не добавляется в автозагрузку: В SysVinit проверьте наличие символьных ссылок в
/etc/rc?.d/. В OpenRC убедитесь, что сервис добавлен в нужный runlevel (rc-update show). - Сервис запускается, но сразу падает: Проверьте логи (см. Шаг 5). Частые причины: неправильный путь к бинарнику, отсутствие конфигурационного файла, недостаток прав (попробуйте
user=в скрипте OpenRC илиstart-stop-daemon --chuid). - Зависимости сервиса: Если ваш сервис требует сеть или базу данных, обязательно укажите зависимости в скрипте (
depend()в OpenRC или комментарии# Required-Start:в SysVinit). Это предотвратит гонки при запуске. - Сервис не реагирует на
stop: Возможно, скриптstopнекорректно обрабатывает сигналы. Используйтеstart-stop-daemon --stop --retry=TERM/30/KILL/5для корректного завершения.