例如,我有以下脚本:
...
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.d
S
start()
我认为不会。该函数是脚本的内部函数,脚本必须调用它本身。
围绕该初始化脚本的另一个脚手架使用一个参数来调用,该参数告诉我们要做什么,start
,stop
,restart
等等。链接的名称 (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)开头时,它将运行停止功能。