LSB tags в Debian 6 для init скриптов

/etc/init.d lsb_tags init script

LSB tags в Debian 6 для init скриптовstrattumjuly 26th, 2012Трабл возник когда при установке пакетов начало писать такую ошибку на самопальные init-скрипты

insserv warning script 'myscript' missing lsb tags and overrides debian

Немного теории:

Автозапуск программы как демона

Обычно в системе уже есть много подсказок как это сделать, но всё-таки приходится лазить по разным файлам и искать в интеренете дополнительную информацию. Это не значит, что я опишу тут каждую букву, но искать придётся меньше, надеюсь.

Для начала стоит заглянуть в каталог /etc/init.d. Здесь содержатся запускные скрипты всех сервисов, а также два файла для желающих написать себе такой же:

README и skeleton

skeleton содержит в себе болванку скрипта запуска с довольно подробными комментариями, а README его неплохо дополняет, не смотря на его небольшой размер. Также можно посмотреть и другие файлы и попытаться найти там что-то, что прояснит непонятную ситуацию.

В 6-ом debian`е для запускных скриптов демонов используется LSB Linux Script Base Init Standart. Почитать о нём подробнее можно тут. Для систем, где LSB не используется стоит взглянуть сюда.

Рассмотрим поближе файл skeleton. Первое с чего он должен начинаться, конечно же “#!/bin/sh”, т.к. init-скрипт — запускной файл. Далее идёт комментированный заголовок:

### BEGIN INIT INFO# Provides:          skeleton# Required-Start:    $remote_fs $syslog# Required-Stop:     $remote_fs $syslog# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: Example initscript# Description:       This file should be used to construct scripts to be#                    placed in /etc/init.d.### END INIT INFO

Может показаться, что это просто лишняя информация от автора, но это не так. То, что указано здесь используется при прописывании скрипта в систему. Тут как раз пригодится файл README, который показывает, что в заголовке skeleton перечислены не все возможные параметры. Как минимум есть ещё следующие:

# Should-Start:      $portmap# Should-Stop:       $portmap# X-Start-Before:    nis# X-Stop-After:      nis# X-Interactive:     true

Все параметры и их полное описание на английском можно увидеть тут, а на русском тут. К русскому варианту добавлю, что в Required-Start: можно прописать $all, тогда текущий скрипт будет запускаться после всех остальных иногда это бывает нужно. Также X-Interactive: true показывает, что этот скрипт может взаимодействовать с пользователем, запросом на ввод чего-нибудь, например пароля.

Далее в skeleton идёт инициализация переменных, используемых в самом скрипте. Часть из них нужно будет настроить под свои нужды. Потом проверки на то, что сам демон существует и попытка прочитать конфигурационный файл их имена должны быть указаны в переменных выше, далее загрузка переменных rcS, а потом идёт одна из самых интересных частей init-файла:

. /lib/lsb/init-functions

это определение LSB функций работы с логами, LSB-статусом сервиса, работы с процессом. В некоторых дистрибутивах этот файл может находиться в каталоге /etc/init.d. Названия и часть подробностей можно узнать непосредственно из комментариев к функциям в этом файле, а также тут.

Следующая часть — непосредственно тело скрипта. Тело состоит из условных частей, которые являются командами для демона: start, stop, restart/reload/force-reload, status. Кто-то выделяет их в отдельные функции, кто-то нет. На мой взгляд, функциями они выглядят эстетичнее и код более понятен. Все эти команды объединяет оператор выбора case, который и выбирает для исполнения нужный кусок кода, в зависимости от команды параметра с которой был запущен init-скрипт.

Таким образом для создания обычного скрипта достаточно подставить в переменные в начале файла нужные значения и, возможно, немного добавить кода в функции start/stop например загрузку/выгрузку драйвера.

После того как файл будет готов его нужно скопировать в /etc/init.d и добавить в автозагрузку:

update-rc.d \<имя_скрипта> defaults

или insserv \<имя\_скрипта\> для debian 6 stable и выше

Удалить из автозагрузки можно так:

update-rc.d -f \<имя_скрипта> remove

или insserv \-r \<имя\_скрипта\> для debian 6 stable и выше

Далее также можно использовать команды sysv-rc-conf в debian или service в fedora core, чтобы включить/выключить автозагрузку сервиса.

Что же нужно сделать:

1) Добавляем в начало init-скрипта можно после \#\!/bin/bash

### BEGIN INIT INFO# Provides:          myscript# Required-Start:# Required-Stop:# Default-Start:     2 3 4 5# Default-Stop:      1 0 6# Short-Description: simple description.### END INIT INFO

2) затем в консоли пишем

update-rc.d myscript defaults
insserv myscript

3) Вот и все!lsb