Автор Тема: Работа с init-скриптами в Debian Squeeze  (Прочитано 13826 раз)

0 Пользователей и 1 Гость просматривают эту тему.

vovka

  • Global Moderator
  • Про
  • *****
  • Сообщений: 787
    • Просмотр профиля
    • www.nixzeya.ru.net
Работа с init-скриптами в Debian Squeeze
« : Среда, 23 Февраля, 2011, 13:08:37 »
    Очень разочаровался, что в Debian Squeeze внедрили LSBInitScripts вместо чистой классической системы SystemV. Когда дошли руки до настройки запуска самописного скрипта, я разочаровался ещё больше.  :'(  С каждым выпуском Debian, человек всё больше теряет возможность управлять системой вручную. В прошлых версиях дистрибутива, скрипты в /etc/init.d и ссылки на них в /etc/rc*.d создавал сам с помощью консоли и текстового редактора. При этом определяя и продумывая порядок загрузки самостоятельно. Вот внедрили новую систему, создали ещё кучу слоёв абстракции и я, как пользователь системы, потерял простой способ управления процедурой старта демонов\скриптов.
    Все хвалят "козырь" этой системы, как и upstart`а - быстрая загрузка за счёт распараллеливания процессов, но это актуально для ноутов и переносных устройств, но никак не для серверов и домашних станций. Получается что технически, система стала сложнее, а для пользователя - проще, но проще только в рамках приложений Debian`а, где каждое, настроено особым образом и "отшлифовано" для общей системы. Шаг в сторону и система рушится - вобщем поставить самописный скрипт нужно ещё научиться.  :(  Конечно, можно систему "спрямить", но потом возникнут проблемы с установкой и обновлением пакетов. В своё время я вовремя перешёл на ArchLinux, а с Ubuntu, как продвинутый пользователь, и вовсе не совместим  ;)

    Довольно критики, разберём установку скрипта для запуска демона.
1. Модифицируем наш скрипт так, чтобы после #!/bin/** шёл блок с параметрами для запуска.
До модификации:
#!/bin/bash
# Script for run ftp daemon

# Main variables
...
...
exit 0
После модификации:
#!/bin/bash
# Script for run ftp daemon
### BEGIN INIT INFO
# Provides:          vsftpd
# Required-Start:    $remote_fs $syslog exim4
# Required-Stop:     $remote_fs $syslog exim4
# Default-Start:     2 3 4 5
# Default-Stop:      1
# Short-Description: Running vsftpd server
### END INIT INFO

# Main variables
...
...
exit 0
В блоке прописываются параметры: имя, зависимости, уровни запуска и останова, на которых должен запускаться\останавливаться данный скрипт. LSBInitScripts, при формировании базы данных о том когда и какой сценарий запустить, прочитывает этот текстовый блок скрипта.

2. Ложим скрипт в /etc/init.d/
Просматриваем /etc/rc2.d :
root@comp:/# ls -l /etc/rc2.d/
итого 4
-rw-r--r-- 1 root root 677 Янв  1 14:35 README
lrwxrwxrwx 1 root root  17 Фев 19 21:58 S14portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root  20 Фев 19 21:58 S15nfs-common -> ../init.d/nfs-common
lrwxrwxrwx 1 root root  17 Фев 19 21:58 S17rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root  17 Фев 22 12:34 S18apcupsd -> ../init.d/apcupsd
lrwxrwxrwx 1 root root  13 Фев 19 21:58 S18atd -> ../init.d/atd
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root  16 Фев 19 21:58 S18lwresd -> ../init.d/lwresd
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18mdadm -> ../init.d/mdadm
lrwxrwxrwx 1 root root  13 Фев 19 21:58 S18ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root  14 Фев 19 21:58 S19cron -> ../init.d/cron
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S19exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root root  18 Фев 19 21:58 S20bootlogs -> ../init.d/bootlogs
lrwxrwxrwx 1 root root  18 Фев 19 21:58 S21rc.local -> ../init.d/rc.local
lrwxrwxrwx 1 root root  19 Фев 19 21:58 S21rmnologin -> ../init.d/rmnologin
lrwxrwxrwx 1 root root  23 Фев 19 21:58 S21stop-bootlogd -> ../init.d/stop-bootlogd

3. Для установки выполняем:
root@comp:/# insserv -v /etc/init.d/vsftpd
Для удаление используется параметр -r:
root@comp:/# insserv -v -r /etc/init.d/vsftpd
4. Проверяем наличие символической ссылки на скрипт:
root@comp:/# ls -l /etc/rc2.d/
итого 4
-rw-r--r-- 1 root root 677 Янв  1 14:35 README
lrwxrwxrwx 1 root root  17 Фев 19 21:58 S14portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root  20 Фев 19 21:58 S15nfs-common -> ../init.d/nfs-common
lrwxrwxrwx 1 root root  17 Фев 19 21:58 S17rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root  17 Фев 22 12:34 S18apcupsd -> ../init.d/apcupsd
lrwxrwxrwx 1 root root  13 Фев 19 21:58 S18atd -> ../init.d/atd
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18bind9 -> ../init.d/bind9
lrwxrwxrwx 1 root root  16 Фев 19 21:58 S18lwresd -> ../init.d/lwresd
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S18mdadm -> ../init.d/mdadm
lrwxrwxrwx 1 root root  13 Фев 19 21:58 S18ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root  16 Фев 23 14:15 S18vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root  14 Фев 19 21:58 S19cron -> ../init.d/cron
lrwxrwxrwx 1 root root  15 Фев 19 21:58 S19exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root root  18 Фев 19 21:58 S20bootlogs -> ../init.d/bootlogs
lrwxrwxrwx 1 root root  18 Фев 19 21:58 S21rc.local -> ../init.d/rc.local
lrwxrwxrwx 1 root root  19 Фев 19 21:58 S21rmnologin -> ../init.d/rmnologin
lrwxrwxrwx 1 root root  23 Фев 19 21:58 S21stop-bootlogd -> ../init.d/stop-bootlogd

Ссылка появилась:
lrwxrwxrwx 1 root root  16 Фев 23 14:15 S18vsftpd -> ../init.d/vsftpd

Для подробностей по параметрам информационного блока в скрипте, читаем man insserv 
« Последнее редактирование: Суббота, 09 Июля, 2011, 08:43:42 от vovka »
*nix - свобода мысли, свобода творчества!

Vena

  • Собеседник
  • ****
  • Сообщений: 375
    • Просмотр профиля
Re: Работа с init-скриптами в Debian Squeeze
« Ответ #1 : Четверг, 02 Июня, 2011, 05:26:04 »
    а с Ubuntu, как продвинутый пользователь, и вовсе не совместим  ;)
Просто у всех разные задачи.  Тебе, например, нравится больше процесс настройки, а мне использования! ;)
« Последнее редактирование: Суббота, 09 Июля, 2011, 08:44:07 от vovka »

vovka

  • Global Moderator
  • Про
  • *****
  • Сообщений: 787
    • Просмотр профиля
    • www.nixzeya.ru.net
Re: Работа с init-скриптами в Debian Squeeze
« Ответ #2 : Четверг, 02 Июня, 2011, 14:37:18 »
Тебе, например, нравится больше процесс настройки, а мне использования! ;)
Не в этом дело. В Ubuntu много лишнего, чего лично мне не нужно и никогда не пригодится в работе, а ресурсов "кушает" очень много. Только поэтому приходится брать в руки напильник. Сейчас проще делаю - ставлю минимальную систему, а затем дабавляю только то, что действительно нужно. Это один из плюсов открытых технологий.
В windows с этим вообще плохо - в ней почти ничего нельзя изменить, это "монолит" - неломаемая стена. Быстрее напильник сломается, чем в винде что-то грамотно и как тебе нужно сделаешь.
« Последнее редактирование: Суббота, 09 Июля, 2011, 08:44:19 от vovka »
*nix - свобода мысли, свобода творчества!

vovka

  • Global Moderator
  • Про
  • *****
  • Сообщений: 787
    • Просмотр профиля
    • www.nixzeya.ru.net
Re: Работа с init-скриптами в Debian Squeeze
« Ответ #3 : Суббота, 09 Июля, 2011, 07:56:28 »
Некоторые пояснения к опциям.
Вся служебная информация заключена в блоке между строками:

### BEGIN INIT INFO

### 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
    системный журнал функционирует
    $time
    установленно корректное системное время, например, ntp или rdate, или RTC
    $all
    Запускает скрипт как можно последним


Источники:
http://wiki.debian.org/LSBInitScripts
http://varlog.voan.ru/2009/12/autostart-initd-in-debian.html
« Последнее редактирование: Суббота, 09 Июля, 2011, 08:44:26 от vovka »
*nix - свобода мысли, свобода творчества!

vovka

  • Global Moderator
  • Про
  • *****
  • Сообщений: 787
    • Просмотр профиля
    • www.nixzeya.ru.net
Re: Работа с init-скриптами в Debian Squeeze
« Ответ #4 : Воскресенье, 16 Октября, 2011, 12:30:28 »
Required-Stop Не работает как надо, точнее как описана его логика.
Предположим есть 2 сервиса: service1 и service2 , которые нужно закрывать именно в обратном порядке:
service2
service1
причём service1 должен работать до тех пор, пока полностью не отработает скрипт /etc/init.d/service2 stop и не выгрузит процесс service2. Другими словами - сервисы зависимы.

Если я правлю скрипт /etc/init.d/service2 и помещаю в него код:
...
# Required-Stop:     $remote_fs $syslog exim4 service1
...
Так если указываю что закрытие сервиса service2 должно быть только перед закрытием service1. Затем выполняю insserv, который в каталогах /etc/rc*.d выстраивает правильные симлинки:
K01service2
K02service1

Когда начинаю проверять, всё происходит не последовательно, а одновременно: выполнение service1 stop НЕ ЖДЁТ завершения работы команды service2 stop !!! Поэтому приходится вставлять в скрипт управления service1 код, который проверяет наличие в памяти процессов от service2. Если таковые присутствуют, service1 stop "курит" в течении некоторого времени, а затем снова проверяет (и так несколько раз) и если все процессы от service2 выгрузились, то скрипт service1 stop выполняется и выгружает процессы service1.

Кто работает в Debian - будьте внимательны с зависимыми процессами.
*nix - свобода мысли, свобода творчества!