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

如果我将此脚本放入目录中,并在创建文件名以 (start) 开头的/etc/init.d链接后,Linux 如何知道使用函数需要该脚本?rc3.dSstart()

我认为不会。该函数是脚本的内部函数,脚本必须调用它本身。

围绕该初始化脚本的另一个脚手架使用一个参数来调用,该参数告诉我们要做什么,startstoprestart等等。链接的名称 (K*S*) 说明运行脚本的顺序以及是否应告知它们启动或停止。当然,systemd 的做法有点不同,但如果我理解正确的话,它仍然可以支持这样的 init 脚本,因此在运行它们时必须向它们传递正确的参数。

然后你会在初始化脚本中看到类似这样的东西:

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)开头时,它将运行停止功能。

相关内容