![如何負責顯示 `Starting ... [ ok ]`](https://rvso.com/image/1562705/%E5%A6%82%E4%BD%95%E8%B2%A0%E8%B2%AC%E9%A1%AF%E7%A4%BA%20%60Starting%20...%20%5B%20ok%20%5D%60.png)
當我啟動一項服務時,例如:
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 的優點之一 - 你不會得到「這取決於」的答案。