Форум Зейского сообщества любителей ОС Linux и Unix
Тематические обсуждения *nix => Базовая настройка => Тема начата: vovka от Среда, 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
-
а с Ubuntu, как продвинутый пользователь, и вовсе не совместим ;)
Просто у всех разные задачи. Тебе, например, нравится больше процесс настройки, а мне использования! ;)
-
Тебе, например, нравится больше процесс настройки, а мне использования! ;)
Не в этом дело. В Ubuntu много лишнего, чего лично мне не нужно и никогда не пригодится в работе, а ресурсов "кушает" очень много. Только поэтому приходится брать в руки напильник. Сейчас проще делаю - ставлю минимальную систему, а затем дабавляю только то, что действительно нужно. Это один из плюсов открытых технологий.
В windows с этим вообще плохо - в ней почти ничего нельзя изменить, это "монолит" - неломаемая стена. Быстрее напильник сломается, чем в винде что-то грамотно и как тебе нужно сделаешь.
-
Некоторые пояснения к опциям.
Вся служебная информация заключена в блоке между строками:
### 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
-
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 - будьте внимательны с зависимыми процессами.