update-rc.d

  • update-rc.d - install and remove System-V style init script links
  • service
  • invoke-rc.d

Запустить (остановить) программу или скрипт (набор команд) в Debian, Ubuntu) можно несколькими способами:

  1. Команды запуска размещенные в файле /etc/rc.local запускаются на на всех runlevel’ах. Например,
    ifconfig eth0:1 192.168.1.2 netmask 255.255.255.0 up

    В последних версиях дистрибутивов скрипт rc.local либо вообще пуст (хотя еще и сохраняется), либо выполняет очень ограниченные задачи. И некоторые авторы вообще не рекомендуют им пользоваться. Не забываем проверять что файл rc.local будет обрабатываться, для Ubuntu 16.04 выполните команду:

    # systemctl status rc-local.service
     rc-local.service - /etc/rc.local Compatibility
       Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
      Drop-In: /lib/systemd/system/rc-local.service.d
               └─debian.conf
       Active: active (exited) since Mon 2018-02-05 06:17:49 EST; 4 days ago
  2. Для остановки нужного сервиса, находится файл с именем сервиса в каталоге /etc/default. В файле нужно поменять строчку «RUN=YES» на «RUN=NO» (или найти похожую и отредактировать). После этого сервис перестанет стартовать не только при загрузке ОС, но и при помощи запуска из /etc/init.d и использовании invoke-rc.d.
  3. Запуск программ размещенных в директории /etc/init.d: Запускающийся скрипт нужно разместить в каталоге /etc/init.d, далее нужно сделать символьную ссылку на этот запускающий скрипт в /etc/rc№.d , где № - это номер runlevel’а, т.е. уровень загрузки системы. Полученная ссылка должна выглядеть так S№№имя_скрипта, где №№ - номер очередности загрузки, если нужно чтобы ссылка осталась, но временно скрипт не запускался, ссылка должна выглядеть так K№№имя_скрипта. Скрипты в любом из каталогов /etc/rcN.d/, по сути, являются символическими ссылками на скрипты из каталога /etc/init.d/. Однако, сами имена файлов в каждом /etc/rcN.d/ каталоге определяют способ, которым будут запущены скрипты из /etc/init.d/. Конкретнее, перед входом в любой уровень исполнения сначала запускаются все скрипты, начинающиеся с буквы 'K'; данные скрипты останавливают сервисы. Далее выполняются все скрипты, начинающиеся в буквы 'S'; эти скрипты запускают сервисы. Двузначное число после буквы 'K' или 'S' показывает порядок, в котором выполняются скрипты. Скрипты с меньшим номером выполняются первыми.

Как сделать символьную ссылку? Необходимо перейти в каталог в котором вы хотите разместить эту ссылку написать команду ln -s “путь до скрипта”. Вместо создания линков в директориях rc.d вручную, используется утилита update-rc.d.

  • Вывести список init скриптов и из состоянии
    service --status-all
     
     [ - ]  acpid
     [ - ]  anacron
     [ + ]  apparmor
     [ + ]  apport

    Примеры использования update-rc.d

       update-rc.d [-n] [-f] B name  remove
       update-rc.d [-n] B name  defaults [NN | SS KK]
       update-rc.d [-n] name start|stop R NN runlevel  [ runlevel ]...  .  start|stop R NN runlevel  [ runlevel ]...  . ...
       update-rc.d [-n] B name  disable|enable [ S|2|3|4|5 ]

Добавление скрипта в автозагрузку:

        update-rc.d <name> defaults , где аргумент 'defaults' относится к уровням запуска со 2 по 5.
        update-rc.d <name> defaults 99 , где 99 порядок загрузки (выполнения)

Полностью удалить скрипт из автозагрузки и все ссылки на него:

        update-rc.d <name> remove

Отключить автозапуск скрипта. Ключ -f указывает удалить ссылки на скрипт из всех уровней запуска (сам скрипт в /etc/init.d не удаляется):

        update-rc.d -f <name> remove

Файл, который можно взять за основу нового скрипта запуска.

     /etc/init.d/skeleton

Отключение AppArmor

AppArmor представляет собой модуль безопасности (аналог SELinux как правильно отключить!! Для начинающих), который должен обеспечить расширенную безопасность. Но это обычно вызывает больше проблем, чем преимуществ (подумайте об этом, после того как вы провели неделю диагностики потому, что некоторые службы не работают, как ожидалось, а затем выяснили, что все было нормально, и только AppArmor была причиной проблем). Поэтому я отключаю его.

Мы можем отключить это так:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt remove apparmor

Примеры скриптов для автозагрузки

В начале скрипта. В блоке ### BEGIN INIT INFO ### END INIT INFO находится вся служебная информация, необходимая для правильного запуска скрипта (в составе ОС находится файл, который можно взять за основу нового скрипта запуска /etc/init.d/skeleton):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          openbsd-inetd
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $syslog
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop the inetd daemon.
### END INIT INFO

Все строки между которыми должны быть в формате

# {ключевое_слово}: арг1 [арг2...]

Строка начинается со знака # и последующего одного пробела. ключевое_слово может быть одним из:

  • Provides: Описывает предоставляемые этим скриптом объекты (арг1, агр2, …) таким способом, что, когда скрипт запускается с аругментом start, данные объекты считаются существующими, и, следовательно, другие скрипты в init, которые требуют существование этих объектов, смогут запуститься на более поздней стадии. Обычно, можно использовать имя скрипта в качестве объекта, но так же можно использовать имя сервиса, которую он заменяет. Виртуальные объекты тут не указываются. Они определены вне скриптов init.d
  • Required-Start: Задаёт объекты, которые должны существовать, чтобы запустить скрипт. Можно использовать при необходимости виртуальные объекты, как описано ниже. Если объекты не указаны, то этот скрипт может быть запущен сразу после старта, не требуя подключенных локальных файловых систем, запущенного системного журнала и т.д.
  • Required-Stop: Задаёт объекты, используемые сервисом, предоставляемой скриптом. Объект, предоставляемый этим скриптом должен завершиться до завершения перечисленных здесь объектов, чтобы избежать конфликтов. Обычно, здесь указывают те же объекты, что и в Required-Start
  • Should-Start: Задаёт объекты, которые, если существуют, должны должны быть запущены перед сервисом, предоставляемым данным скриптом. Это допускает слабые зависимости, которые не приводят сервис к ошибке, если объекты не доступны. Можно использовать при необходимости виртуальные объекты, как описано ниже.
  • Should-Stop: Задаёт объекты, если существуют должны быть остановлены уже после данного сервиса. Обычно, здесь указывают те же объекты, что и в Should-Start
  • Default-Start: Задаёт уровни запуска, на которых скрипт должен быть запущен (остановлен) по умолчанию. Например, если сервис должен быть запущен на только уровнях 3, 4 и 5, укажите "Default-Start: 3 4 5" и "Default-Stop: 0 1 2 6".
  • Short-Description: Задаёт короткое описание действия скрипта. Ограничено одной строкой.
  • Description: Задаёт более подробное описание действия скрипта. Может быть в несколько строк, в этом случае, каждая строка описания должна начинаться с символа # с последующим знаком табуляции или как минимум 2-мя символами пробела. Описание заканчивается перед линией, не совпадающим с этим условием.
  • X-Start-Before, X-Stop-After: Задаёт обратные зависимости, которые значат то же, как если бы они были указаны в should-start и should-stop в пакетах, указанных тут.

Для отслеживания зависимостей важны ключевые слова provides, required- и should-. Остальные не используются. Уровни запуска по умолчанию используются программой для упорядочивания скриптов (например, insserv) для того, чтобы отслеживать, какой из каталогов rc#.d обновлять, когда служба добавляется в первый раз, и должны отражать назначение сервиса.

"Виртуальные" объекты:

  • $local_fs Все локальные фаловые системы подключены. Все скрипты, которые производят запись в /var/ должны зависеть от этого, если они уже не зависят от $remote_fs.
  • $network Низкоуровневая сеть, т.е. сетевые карты, может подразумеваться PCMCIA запущеной.
  • $named Демоны, которые могут предоставлять разрешение доменных имён предполагаются запущенными. Например, DNS, NIS+ или LDAP.
  • $portmap Демоны, предоставляющие сервис SunRPC/ONCRPC portmapping как указано в 1833 (если они есть).
  • $remote_fs Все файловые системы подключены. Скрипты, которые должны быть запущены во время остановки системы до того, как всем процессам будет отправлен сигнал уничтожения, должны зависеть от $remote_fs.
  • $syslog Cистемный журнал функционирует.
  • $time Установленно корректное системное время, например, ntp или rdate, или RTC.
  • $all Запускает скрипт как можно последним.
PQ VPS сервера в 28+ странах.