確定用於任何給定應用程序的 systemd 服務的“類型”的方法
我認為我對
Type
systemd 可以配置的不同服務(例如simple
,oneshot
等)有一個相對較好的處理。文件提供了相當合理的選項概述和描述。因此,通常可以“猜測”可能的最佳選擇並進行“反複試驗”來確認。對於我非常熟悉的應用程序尤其如此。
但是,我擔心在我的“試錯”測試期間可能存在我沒有考慮到的情況(即邊緣案例錯誤的風險)。因此,我正在尋求有關測試/調查應用程序的方法的建議,以確定它可能是最好的
Type
。FWIW,我正在考慮手動啟動應用程序並跟踪它的響應方式,無論它是否分叉(多個程序等)。我覺得必須有一些我缺少的相對簡單的方法(使用標準命令行工具)。
我不確定它是否相關,但 Debian 是我選擇的發行版。
當您從命令行手動啟動服務時(不使用
nohup
前綴命令或&
後綴在後台執行它,或者換句話說,只執行您將放在文件ExecStart=
行上的.service
命令),會發生什麼?**a)**如果服務啟動並保持執行,並且直到您按 Control-C 或以其他方式停止服務後提示才返回:那麼
Type = simple
是正確的選擇。**b)**如果提示返回但服務繼續在後台執行(即服務自行守護程序),那麼
Type = forking
是正確的選擇。**c)**如果服務完成了它的工作並返回到提示符而不讓任何東西執行(即服務只是調整一些核心設置,向其他東西發送命令或做類似的事情),那麼
Type = oneshot
可能是正確的選擇。在這種情況下,ExecStart
服務可能是“設置”某些東西的命令,並且ExecStop
是“取消設置”它的相應命令。這種類型通常受益於RemainAfterExit=true
,因此 systemd 將根據事物是最近“設置”還是“未設置”來跟踪該服務的“狀態”。其他
Type
值是特殊情況。例如,如果服務使用 D-Bus 連接,那麼Type = dbus
可能是最佳選擇。它會systemd
意識到這一事實,然後 systemd 將通過 D-Bus 上該服務的存在來跟踪該服務(以及任何依賴它的服務)。要使用
Type = notify
,程序必須能夠連接到環境變數中指定的 Unix 套接字,$NOTIFY_SOCKET
並在必要時通過向該套接字寫入消息來報告其狀態。此外,服務文件應指定NotifyAccess
適當的選項以授予對通知套接字的訪問權限。您可以使用命令行實用程序
systemd-notify
和 C 庫函式sd_notify(3)
來發送這些消息,但如果它們都不適合您的要求,您可以實現自己的消息發送器。所需的消息非常簡單,看起來像 shell 變數賦值:例如,通知服務已成功完成啟動並準備好為任何傳入請求提供服務,服務應將與輸出等效的字元串發送printf "READY=1\n"
到套接字。有關man 3 sd_notify
已辨識消息的更多詳細資訊,請參閱。注意:許多設計為可移植到許多 Unix 風格系統的服務應用程序預設情況下可能表現為 b),但可以通過添加選項(通常描述為“不要分叉”、“繼續執行在前台”,“不要守護”或類似的)。在這種情況下,如果該選項沒有其他副作用,那麼添加該選項並使用 a) 類型的行為對於
systemd
.