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)開頭時,它將運行停止函數。

相關內容