Как Linux узнает, какую функцию выбрать в каталоге rcX.d?

Как Linux узнает, какую функцию выбрать в каталоге rcX.d?

Например, у меня есть следующий скрипт:

...
start(){
  echo "Starting..."   
  su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"       
  su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"
  touch /var/lock/subsys/dbora 
}

stop(){
  echo "Stopping..."
  su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"
  su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
  rm -f /var/lock/subsys/dbora
}

restart(){
  stop
  start
}

usage(){
  echo "usage: $0 {start|stop|restart}"
}
...

Если я помещу этот скрипт в каталог /etc/init.d и после этого создам ссылку в rc3.d с именем файла, начинающимся с S(start), как Linux узнает, что необходимо использовать функцию start()?

решение1

Если я помещу этот скрипт в каталог /etc/init.dи после этого создам ссылку rc3.dс именем файла, начинающимся с S(start), как Linux узнает, что необходимо использовать функцию start()?

Я не думаю, что это так. Функция является внутренней для вашего скрипта, и скрипт должен сам ее вызывать.

Другие леса, окружающие этот скрипт инициализации, вызываются с аргументом, который сообщает, что делать, start, stop, restartили что-то в этом роде. Имена ссылок ( K*и S*) сообщают, в каком порядке запускать скрипт и следует ли им сообщать о запуске или остановке. Конечно, systemd делает все немного по-другому, но если я правильно понимаю, он все еще может поддерживать такие скрипты инициализации, и поэтому должен передавать им правильный аргумент при запуске.

Итак, в скриптах инициализации вы видите что-то вроде этого:

do_start() {
    something here...
}
do_stop() {
    something else here...
}

case $1 in
    start)
        do_start;;
    stop)
        do_stop;;
    restart)
        do_stop;
        do_start;;
    *)
        usage;;
esac

Внизу caseпроверяется первый аргумент и выполняется работа на его основе; именно эта часть отсутствует в вашем фрагменте.

Если вы пишете новый сценарий инициализации, вам следует рассмотреть возможность его реализации в виде службы systemd.

решение2

Он (Linux) не делает. Linux — это ядро. Операционная система Gnu/Linux знает.

В частности, initпроцесс знает. initскрипты должны иметь start, stop, restart. Эти методы имеют предопределенные значения и вызываются в соответствующее время. Эти методы являются интерфейсом для вашего скрипта, вам нужно реализовать их.

решение3

Из-за "S", с которого вы начали ссылку. Когда ссылка начинается с "K" (от kill), она запустит функцию stop.

Связанный контент