Debian автозапуск скрипта при загрузке

Обновлено: 03.07.2024

Скрипты инициализации - это не большие программы на shell, которые обычно управляют сервисами, также известными как демоны. Прочие приложения для скриптов инициализации включают в себя простое управление состоянием чего-нибудь вроде hdparm (управляет временем перехода в спящий режим для жестких дисков), iptables (загрузка правил файрвола в ядро) и setserial (конфигурация последовательного порта). Директория /etc/init.d содержит скрипты исполняемые с помощью init во время загрузки и состоянии инициализации.

Скрипты инициализации также важны во время запуска и останова системы (в *nix системах просто меняется“runlevel”). Если вы посмотрите на список процессов, запущенных на вашей машине (попробуйте команду ps auwx), то есть вероятность, что процесс с наименьшим PID будет называться “init”. Это родительский процесс для всех процессов, это первая программа которую ядро запускает при загрузке. Программа init, которую можно найти по пути /sbin/init, ответственна за в рабочее состояние после того, как загрузится ядро.

Существует три простые утилиты для управления стартовыми и инициализационными скриптами:

Далее мы рассмотрим их все и приведем несколько примеров их использования.

update-rc.d

Устанавливает и удаляет ссылки на скрипты инициализации в System-V стиле. update-rc.d автоматически обновляет ссылки на скрипты инициализации в System-V стиле вида /etc/rcrunlevel.d/NNname на скрипты /etc/init.d/name. Они запускаются с помощью init когда меняется уровень загрузки и обычно используются для запуска или остановки системных сервисов, таких как демоны. init поддерживает следующие уровни загрузки - 0123456789S и NN - это двухцифренный код используемый init для определения в каком порядке должны запускаться скрипты.

Синтаксис update-rc.d

update-rc.d [-n] [-f] name remove
update-rc.d [-n] name defaults [NN | NN-start NN-stop]
update-rc.d [-n] name start|stop NN runlevel runlevel start|stop NN runlevel runlevel

Когда запускается с опциями defaults, start или stop, update-rc.d создает ссылки /etc/rcrunlevel.d/[SK]NNname указывающие на скрипт /etc/init.d/name. Если какие-либо файлы уже существуют, то update-rc.d ничего не делает. Это объясняется тем, что системный администратор может изменить порядок ссылок, при условии, что как минимум одна ссылка сохранится, без того чтобы конфигурация была перезаписана.

Доступные опции.

-n - ничего не делать, только показать что будет сделано.
-f - заставить удалять символические ссылки даже если /etc/init.d/name все еще существует.

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

Вставить ссылки с использованием defaults:

Эквивалентная команда с использованием явных наборов аргументов:

Если вы хотите удалить скрипт из автозагрузки, то используйте следующую команду:

Если вы хотите узнать о команде update-rc.d больше, то прочтите страницу man.

rcconf

Rcconf позволяет управлять тем, какие сервисы будут запускаться когда система загружается или уходит в перезагрузку. Утилита показывает меню, содержащее все сервисы, которые должны быть запущены при загрузке. Те, которые должны запускаться помечены и вы можете включить или выключить отдельные сервисы. Эта утилита конфигурирует системные сервисы во взаимодействии с системными уровнями загрузки (runlevels). Она включает или выключает сервисы с применением скриптов в /etc/init.d/. Rcconf работает с конфигурацией уровней загрузки в стиле System-V. Фактически это TUI(Text User Interface) к команде update-rc.d

Rcconf получает список сервисов от /etc/init.d и просматривает директории /etc/rc?.d чтобы определить запущен сервис или нет.

Если число (NN в /etc/rc?.d/NNname) не равно 20 (по умолчанию), то rcconf сохраняет имя сервиса и число в /var/lib/rcconf/services так что возможно восстановить конфигурацию сервиса в исходном состоянии.

Установка rcconf в Debian.

Эта команда выполнит установку. Теперь вы можете использовать утилиту с помощью команды:

Теперь запустив rcconf Вы увидите на экране следующее:

rcconf управление автозагрузкой

Важные файлы:

/var/lib/rcconf/services - файл с данными о номерах процессов.
/var/lib/rcconf/lock - файл блокировки.
/var/lib/rcconf/guide.default - Guide File который генерируется утилитой update-rcconf-guide.
/var/lib/rcconf/guide - Guide File который может быть определен пользователем (администратором).

Если вы хотите узнать больше об утилите rcconf, то ознакомьтесь со страницей man.

file-rc

Этот пакет предоставляет альтернативный механизм для загрузки или остановки системы и смены уровней загрузки. Ссылки /etc/rc?.d/* будут сконвертированы в единый конфигурационный файл /etc/runlevel.conf который легче администрировать, чем символьные ссылки и который более гибок. Пакет автоматически сконвертирует ваши существующие символьные ссылки в файл во время установки и конвертирует файл обратно в символьные ссылки при удалении. Оба механизма совместимы посредством скриптов /etc/init.d/rc, /etc/init.d/rc*, /usr/sbin/update-rc.d и /usr/sbin/invoke-rc.d

Установка file-rc в Debian.

Следующие НОВЫЕ пакеты будут установлены:
file-rc
0 пакетов обновлено, 1 установлено новых, 0 пакетов отмечено для удаления, и 42 пакетов не обновлено.
Необходимо получить 39,2 kB архивов. После распаковки 184 kB будет занято.
Следующие пакеты имеют неудовлетворённые зависимости:
sysv-rc: Конфликтует: file-rc но устанавливается 0.8.12.
Следующие действия разрешат зависимости:

Утром я поставил систему, установил все необходимые пакеты, дальше начинаю прикручивать к системе скрипты (собственно сервер же заводим не для того чтобы им любоваться, а для работы). Сразу же уточню: cкрипт настраивал проксирование пользователей в интернет, все настройки он брал из PostgreSQL. Таким образом он должен запускаться после того как будет сконфигурирована сеть и запущен демон СУБД. И тут начинается мистика, создаю символическую ссылку на скрипт:

ln /usr/proxy/scripts/start /etc/rc1.d/S99proxy
ln /usr/proxy/scripts/start /etc/rc2.d/S99proxy
ln /usr/proxy/scripts/start /etc/rc3.d/S99proxy
ln /usr/proxy/scripts/start /etc/rc4.d/S99proxy
ln /usr/proxy/scripts/start /etc/rc5.d/S99proxy

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

ln /usr/proxy/scripts/start /etc/network/if-up.d/proxy

Перезагружаю систему, скрипт начинает выполняться, но снова провал. Скрипт настройки сети запускается раньше чем стартует демон СУБД, и соответственно содержимое /etc/network/if-up.d выполняется тоже раньше (собственно оно так и должно быть). Далее решаю поместить в директории rc*.d скрипт со следующим содержанием:

Снова перезагружаю систему, результат нулевой. Помня все туже статью, в голову приходи дикая мысль о том что локальная файловая система не успела примонтироваться. Применяю метод админа-шамана:

После перезагрузки обнаруживаю отсутствие файла /var/log/test.log. От такого облома я решаю схитрить — дописываю в скрипт запуска демона ssh строку с echo. После перезагрузки как и полагается обнаружил то что ждал, файл создался и строчка «Run test» в нем присутствует. Начинаю активно шевелить мозгами, в уме появляется уравнение: запуск скрипта не работает + новая система запуска скриптов при старте системы = неожиданное поведение. Вывод напрашивается один: надо гуглить искать решение в технических статьях и документации.

Вот где собака зарыта

В ходе исследования было выяснено что в Debian Squeeze используется система LSBInitScripts для запуска скриптов при загрузке ОС. Ее особенностью является — по возможности параллельный запуск скриптов. В предыдущем предложении слова «по возможности» являются ключевыми. Нельзя просто взять и параллельно запустить все скрипты, часть скриптов имеет определенные зависимости от других служб. В моем случае скрипт должен выполняться только после запуска СУБД и настройки сети. Для этого LSBInitScripts строит граф зависимостей. Его графическое представление можно увидеть выполнив команды:

aptitude install insserv graphviz
/usr/share/insserv/check-initd-order -g > boot.dot
dotty boot.dot

В моем случае это получилась полнейшая кракозябра. Встал вопрос о том где же хранятся эти зависимости. В вики Debian'на выяснилось, что зависимости указываются в комментариях у скриптов в директории /etc/init.d, вот пример такого комментария для ssh:

Provides — это имя или несколько имен того с чем работает(запускает/останавливает) скрипт. Имена должны быть уникальны.
Required-Start— а вот это как раз и есть наша зависимость, которая указывает что потребуется скрипту для запуска.
Default-Start — показывает на каких уровнях нужно выполнять загрузку скрипта.
Более детальное описание параметров есть здесь.

Создаем свой скрипт

Теперь, когда мы знаем нашего врага в лицо можно попробовать написать пару простеньких скриптов. Вот первый, назовем его test:

echo "Run test" >> /var/log/test.log

echo "Run test2" >> /var/log/test.log

Файлы называются test и test2 соответственно. В данном примере test2 зависит от test, и поэтому test будет запускаться первым, а затем только test2. Поместим их в директорию /etc/init.d. Но этого еще мало, и даже мало будет создания симлинков в /etc/rc*.d. Что бы заставить все это дело работать необходимо выполнить построение нового графа зависимостей, делается это командами:

update-rc.d test defaults
update-rc.d test2 defaults

На полное изучение документации команды update-rc.d пока времени не было. Данная команда переписывает файлы .depend.boot, .depend.start, .depend.stop (это файлы с графом зависимостей, хранятся в /etc/init.d) и создает все нужные симлинки в /etc/rc*.d. Теперь пробуем перезагрузиться, и обнаруживаем что скрипты выполнились. И не просто выполнились абы как, а в определенной последовательности. Если поменять зависимость между test и test2 на обратную то и загрузятся они по другому.

Со своим скриптом я больше сегодня не экспериментировал — голова уже начала плохо думать и время рабочее закончилось, займусь им завтра.

Заключение

В данной статье я не пытался полностью описать новый процесс запуска скриптов в Debian. Моей целью было дать отправную точку для изучения проблемы, сэкономить время других людей (у меня ушло несколько часов на поиск причины, чтение манов и эксперименты).

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

Стоит сразу заметить — чтобы программа была полноценным сервисом/демоном, она должна быть соответствующе написана (link1, link2). Впрочем такое делают не всегда, хотя возможно это и не совсем правильно.

  • записать вызов программы/скрипта запуска в /etc/rc.local в фоновом режиме (&) (в разных дистрибутивах может лежать в разных местах, например, /etc/rc.d/rc.local) с перенаправленными потоками ввода/вывода в /dev/null. Например, "/home/user/my_prog 1 > /dev/null 2 > /dev/null &". Также, дополнительно, можно воспользоваться командой nohup;
  • внести вызов в /etc/inittab, согласно правилам его оформления. В отличие от первого способа тут можно указать уровень запуска для программы;
  • написать скрипт, позволяющий запускать/останавливать/перезапускать программу как демона, а также получать информацию о её состоянии.

Второй метод довольно экзотичный, сам узнал о нём совсем недавно, хотя пишут, что им пользуются многие администраторы. Тем не менее, используя его, нельзя оперировать запущенными таким способом программами как демонами, что довольно неудобно. Да и загромождать inittab некрасиво.

Последний метод на текущий момент самый «кошерный», но немного сложнее предыдущих (возможно, на первый взгляд). Именно им представлены все системные демоны, что говорит само за себя. Потому его и рассмотрю ниже.

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

Сразу обмолвлюсь, что у меня стоит Debian 6 и в других дистрибутивах пути могут несколько различаться.


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

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

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

README и skeleton

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

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

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

Все параметры и их полное описание (на английском) можно увидеть тут, а на русском тут и тут (спасибо awzrno за новые ссылки ^_^). К русскому варианту добавлю, что в 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, чтобы включить/выключить автозагрузку сервиса.


Автозапуск графического ПО без ввода паролей

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

Убрать запрос пароля на вход можно в центре управления (kcontrol) -> системное администрирование -> менеджер входа в систему -> удобства. Там выбрать пользователя, под которым входить (кроме рута) и поставить нужные галочки (разрешить автовход и вход без ввода пароля).

Чтобы сделать автозапуск программы нужно в каталог /home/<пользователь>/.kde/Autostart добавить ссылку на запускной файл/скрипт нужного ПО.

Тут убрать запрос пароля на вход можно также в центре управления (gnome-control-center) -> Login Screen. Там, под рутом (ткнуть на замок, ввести пароль) выбрать пользователя, под которым входить (кроме суперпользователя).

Для автозапуска программы опять же в центре управления выбрать Startup Applications -> Add и заполнить маленькую форму.

Для обоих графических менеджеров:
Если нужно запустить под обычным пользователем, но от рута, то ещё надо настроить правила в /etc/sudoers на запуск конкретной программы/набора программ от имени суперпользователя (манами рекомендуется для безопасности делать это с помощью visudo). Как это делать рассказывать не буду, т.к. в man sudoers всё хорошо расписано.

Хотелось бы чтоб при включении компьютера, чтоб запускалась программка при включении в операционной системе Debian 9. Я прочёл статью о том как в линуксе можно прописать запуск программы при запуске операционной системы.

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

решил через bash :

Самый простой автозапуск скрипта linux - это запуск с помощью bashrc. Ваш скрипт или команда будет выполняться каждый раз, когда запускается новая сессия терминала. Для этого добавьте адрес нужного скрипта в файл

/.bashrc:

Здесь вы можете запускать на выполнение любые скрипты или команды. Часто такой подход используется для создания псевдонимов команд, объявления новых переменных и собственных функций.

Но как только я запустил этот файл едиственное что я мог это только его читать. Да и не совсем понятно куда вписывать

введите сюда описание изображения

Потом решил попробовать другой вариант

в файле /etc/rc.local прописал :

в файл script_run сделан исполняемым. он имеет одну строку ./initialization и запускает скомпилированную программу.

Увы также не чего не вышло (((

Попробовал предложение @Total Pusher -а

введите сюда описание изображения

Увы не вышло хотя и проверял как скрипт (по отдельности также не забыл сделать его исполняемым), также и программу прогнал через chmod +x (когда увидел что не запустилось).

Поправил надо было в файл nano

/.bashrc перед командой вызова скрипта надо было перейти в директорию cd /kononov/initialization1 в которой всё будет происходить.

НО увы программа запускается только кода включается bash .

А хотелось бы чтоб программа включалась после подачи питания и стартовой инициализации аппарата.

Вот последняя итерация, прочитал эту статью , понял что надо прописать именно в директории /ect/rc3.d но я не понял в каком именно файле, и бо их там шесть ( S01cron, S01dbus, S01network-manager, S01rsync, S01rsyslog, S01ssh ), а какой из них запускается последний непонятно.

прочитал я этот вопрос (так сказать мой вопрос его дубликат) и понял что модераторы снова ошиблись.

всё делал по ответу

Делаем файл исполняемым: chmod +x wentilation.

И вот тут самый прикол, в дебиан 9 нету chkconfig , Окей я говорю сейчас установим ввожу sudo apt-get install chkconfig и оказывается его нету даже в репозитории. Только потом узнаю в дебиан 9 менеджер демонов это systemctl и дебиан 9 совершенно не поддерживает chkconfig

Читайте также: