Linux

Управление сервисами в Linux без systemd: полное руководство

Этот гайд подробно объясняет, как управлять системными сервисами в дистрибутивах Linux, которые используют альтернативные системы инициализации вместо systemd, такие как SysVinit и OpenRC.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Alpine Linux 3.18+Debian 10+ (с sysvinit)Gentoo (OpenRC)Void Linux (runit)

Введение / Зачем это нужно

Хотя systemd стал де-факто стандартом для большинства дистрибутивов Linux, существуют популярные и стабильные альтернативы, такие как SysVinit, OpenRC и runit. Этот гайд поможет вам освоить управление сервисами в таких средах. Вы научитесь запускать, останавливать, добавлять в автозагрузку и создавать собственные скрипты для управления службами, что особенно актуально для Alpine Linux, Gentoo, Void Linux и специализированных сборок Debian/Ubuntu без systemd.

Требования / Подготовка

  1. Доступ к терминалу Linux с правами sudo (или root).
  2. Базовое понимание командной строки и структуры каталогов /etc/.
  3. Установленный текстовый редактор (nano, vim).
  4. Знание, какая система инициализации используется в вашем дистрибутиве (см. первый шаг).

Шаг 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 очень похожа, но есть нюансы в заголовке скрипта).

  1. Создайте файл скрипта в /etc/init.d/:
    sudo nano /etc/init.d/myapp
    
  2. Добавьте следующее содержимое (адаптируйте под ваше приложение):
    #!/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.
  3. Сделайте скрипт исполняемым:
    sudo chmod +x /etc/init.d/myapp
    
  4. Для 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 для корректного завершения.

Часто задаваемые вопросы

В чём основное отличие SysVinit от systemd?
Какой дистрибутив Linux по умолчанию не использует systemd?
Безопасно ли управлять критическими сервисами через скрипты вручную?
Можно ли использовать `systemctl` в дистрибутиве без systemd?

Полезное

Определите текущую систему инициализации
Управление сервисами в SysVinit
Управление сервисами в OpenRC
Создание и настройка собственного init-скрипта
Проверка статуса и логов