Как сделать так, чтобы скрипт в /etc/init.d запускался при загрузке?

83

Я думаю, что прочитал что-то об этом некоторое время назад, но я не могу вспомнить, как это было сделано. По сути, у меня есть служба, в /etc/init.dкоторой я хотел бы запускаться автоматически во время загрузки. Я помню, что это как-то связано с символической ссылкой скрипта в /etc/rc.dкаталог, но я не могу вспомнить в настоящее время. Какая команда для этого?

Я считаю, что я нахожусь на производной Fedora / CentOS.

Нафтули Кей
источник
Это зависит от вашей ОС. Какой вариант Unix вы используете, и если Linux, какой дистрибутив? Какой из /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localи несколько больше у него есть?
Жиль
1
Я думаю, что я на CentOS или что-то вроде этого. Будет ли отличаться ответ для Debian? Меня также интересует решение для Debian.
Нафтули Кей,

Ответы:

109

Если вы работаете в системе на базе Red Hat, как вы упомянули, вы можете сделать следующее:

  1. Создайте сценарий и поместите в /etc/init.d(например /etc/init.d/myscript). Скрипт должен иметь следующий формат:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Формат довольно стандартный, и вы можете просматривать существующие сценарии в /etc/init.d. Затем вы можете использовать скрипт, как так /etc/init.d/myscript startили chkconfig myscript start. Страница ckconfigman объясняет заголовок скрипта:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

В примере кода start, stop и status используются вспомогательные функции, определенные в /etc/init.d/functions

  1. Включить скрипт

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Убедитесь, что скрипт действительно включен - вы должны увидеть «вкл» для выбранных вами уровней.

    $ chkconfig --list | grep myscript
    
canen
источник
3
Chkconfig это то, что вы хотите. +1
whoami
Почему init запускает что-то на уровнях выполнения 2, 3, 4 и 5? Не нужно ли вам позаботиться о том, чтобы избежать запуска сервера на уровне выполнения 2? И уровень запуска 4 не определен в RHEL в любом случае, так зачем пытаться запустить его на этом уровне запуска? Не критика, просто желание знать. Я родной пользователь Slackware.
Брюс Эдигер
4 не определено в RHEL, но оно существует. Вы можете украсть это для своих собственных вещей.
Кевин М
Заголовок взят со страницы руководства chkconfig. Я лично придерживаюсь 235 или только 35 в большинстве случаев.
canen
Есть ли журнал, на который я могу посмотреть, если что-то не запускается во время запуска?
Уткарш Синха
10

Вы проверяете, на каком уровне запуска обычно работает ваша машина.

runlevel

Часто это 5 или 2 - существуют различные соглашения, но на самом деле ничего не установлено. Ubuntu использует 2, тогда как предыдущий дистрибутив, который я использовал, всегда использовал

  • 1 одиночный пользователь (суперпользователь)
  • 2 многопользовательских
  • 3 многопользовательских + сеть
  • 4 не используется / определяется пользователем
  • 5 многопользовательских, сеть + X11

Тогда вы сделаете символическую ссылку из вашего инициализации-скрипт, может быть /etc/init.d/foobarв/etc/rc2.d/SXYfoobar

S означает «Запустить этот скрипт на этом уровне выполнения (здесь: 2). XY - это двузначное десятичное число, соответствующее последовательности, сценарии запускаются.

Если вы зависите от сценария S45barfoo, который будет запускаться до вас, а S55foofoo зависит от вашего сценария, вы должны выбрать xy между 45 и 55. Для равных чисел порядок загрузки не определен.

Ubuntu тем временем переключился (переключается) на другую процедуру запуска, которая называется upstart.

И обратите внимание: не всегда ссылки на ссылки /etc/rcX.d- иногда это /etc/init/rcX.dили что-то подобное, но это должно быть легко найти где-то ниже / etc.

Если вы хотите запустить что-то в конце стартовых скриптов, /etc/rc.localэто будет файл для поиска, но если это зависит от того, что X11 уже запущен, вы можете поискать опцию автозапуска в вашей среде рабочего стола или /etc/X11/Xsession.d/с аналогичным шаблоном, как описано выше.

Если вы зависите от работающей сети, существует отдельный каталог (if-up.d) и для подключенных устройств, таких как внешние USB-накопители /etc/udev/rules.d/.

неизвестный пользователь
источник
Разве нет команды, которая делает символическую ссылку для вас? Я думал, что вспомнил что-то подобное.
Нафтули Кей
1
Не так ли update-rc.d?
Нафтули Кей
GUI или командная строка? Ваша DE может предоставить инструмент для отметки уровней запуска, где запускать или останавливать ваш скрипт. Я видел что-то подобное, но не помню имя, и как указать число (xy).
пользователь неизвестен
Командная строка. Он обрабатывает символические ссылки для вас и позволяет включать переключатели независимо от того, выполняются определенные сценарии или нет.
Нафтули Кей
3

Как Нафтули Цви Кей спросил о Debian выше: Начиная с Debian 6, ваш скрипт должен содержать заголовок LSB (База стандартов Linux), который указывает его зависимости и возможности ( см. Вики-страницу debian ).

Если присутствует заголовок LSB, вы можете использовать его insservдля включения скрипта в процесс загрузки ( см. Другую вики-страницу Debian ).

MDT
источник