たとえば、次のスクリプトがあります。
...
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
その init スクリプトを囲む他のスキャフォールディングは、 、stop
など、何をすべきかを示す引数とともに を呼び出しますrestart
。リンクの名前 (K*
およびS*
) は、スクリプトを実行する順序と、スクリプトを開始または停止するように指示するかどうかを示します。もちろん、systemd は少し異なる方法で処理しますが、私の理解が正しければ、systemd はそのような init スクリプトをサポートできるため、スクリプトを実行するときに正しい引数を渡す必要があります。
すると、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
は最初の引数が何であるかをチェックし、それに基づいて動作します。これがスニペットに欠けている部分です。
新しい init スクリプトを作成する場合は、代わりに systemd サービスとして実装することを検討する必要があります。
答え2
Linux はそうではありません。Linux はカーネルです。Gnu/Linux オペレーティング システムはそれを認識しています。
特に、init
プロセスは認識しています。スクリプトには、、、がinit
必要です。これらのメソッドには事前に定義された意味があり、適切なタイミングで呼び出されます。これらのメソッドはスクリプトへのインターフェイスであり、実装する必要があります。start
stop
restart
答え3
リンクを開始した「S」のためです。リンクが「K」(kill から) で始まる場合、停止関数が実行されます。