如何負責顯示 `Starting ... [ ok ]`

如何負責顯示 `Starting ... [ ok ]`

當我啟動一項服務時,例如:

root@foo [~]# service foobar stop
Stopping Foobar:                                       [  OK  ]

我可以看到一個狀態指示器:[ OK ]它與 上可見的狀態指示器不同/var/log/boot.log

[  OK  ] Started LSB: disk temperature monitoring daemon.
...

或甚至不同於:

* /proc is already mounted
* Caching service dependencies ...        [ ok ]

在這三個範例中,哪個程序負責顯示和啟動守護程序?換句話說,哪個庫用於顯示[ OK ], [FAILED]?

答案1

當手動呼叫service從 /etc/init.d 或 /etc/rc.d 執行 SysV 樣式腳本時,所有狀態輸出取決於完全按照那個劇本。

正確編寫的 init.d 腳本將使用發行版提供的 shell 函數庫。例如,在 Debian 中,大多數腳本將載入(來源)文件/lib/lsb/init-functions,並簡單地呼叫其提供的函數,如下所示:

案例“$1”
  開始)
    日誌守護程式訊息“開始$DESC”“$NAME”
    開始
    案例“$?”在
        0|1)日誌結束訊息0 ;;
        2) log_end_msg 1 ;;
    埃薩克
    ;;
  [...]
埃薩克

這是標準函數列表由LSB定義。 (請注意,發行版可能會提供額外的功能超出標準,如上例。另請注意,例如 OpenRC 或 Arch Linux不是LSB 相容並使用完全不同的風格。

事實上,有些發行版也會集中提供此樣板程式碼,而剩下的 init.d 腳本就是實作do_start. (請參閱 Gentoo 的 OpenRC 和 Debian 的/lib/init/init-d-script範例)。然而,這不是一個「標準」LSB 功能 - 試圖相容 LSB 的腳本仍然必須手動完成。


筆記:我強調“正確書寫”,因為確實沒有什麼可以力量一個 init.d 腳本來使用這些功能,而不需要人工監督。如果腳本想要透過普通echo(或cowsay就此而言)報告狀態,它總是能夠做到這一點。對於在正常管道之外分發的商業軟體來說,這尤其是一個問題:它們的狀態輸出絕不看起來很正確(坦白說,整個 init.d 腳本的行為從來都不是很正確)。


同時,當 SysV 腳本在啟動過程,結果更依賴發行版 - 有時您會直接看到腳本本身的輸出,但有時「主」初始化系統將為它啟動的所有服務提供自己的狀態輸出。 (例子:Arch Linux 的舊 initscripts,在背景啟動服務時。

但你的第二個例子其實是不是SysV 風格的 init – 它是 systemd (它恰好在您的範例中啟動了「舊版」 init.d 腳本)。 Systemd 是一個完整的服務管理器,它使用服務配置(而不是腳本),因此全部啟動/關閉狀態輸出由 systemd 本身提供。這也適用於大多數其他“服務管理員”,包括 init-ng、SMF 或 Upstart。

答案2

這來自依賴發行版的初始化腳本。檢查程式的內容service,這可能是一些呼叫底層管理腳本(SysV 現在被認為已過時)或二進位檔案(systemd 是可行的方法)的 shell 腳本。這是 systemd 的優點之一 - 你不會得到「這取決於」的答案。

相關內容