例如,我有以下腳本:
...
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)開頭時,它將運行停止函數。