php小編小新將為您介紹如何將DBus/Systemd設置為Systemd單元的依賴項。DBus和Systemd是Linux操作系統中常用的兩個工具,DBus用于進程間通信,而Systemd則負責系統初始化和進程管理。將DBus和Systemd結合起來使用可以實現更高效的系統管理和資源調度。本文將詳細講解如何在Systemd單元中配置DBus作為依賴項,以幫助您更好地理解和應用這兩個工具的使用方法。
問題內容
我有一個用 go
編寫的小程序,它使用 go-systemd 庫通過 dbus 與 systemd 交互。
程序本身注冊為 systemd 單元并應在引導時啟動。程序運行時,會定期查詢多個單元的systemd單元狀態。
現在當我手動啟動程序時,一切都很好。然而,當 systemd 重新啟動后啟動時,它將“掛起”,這意味著它將無法通過 dbus 查詢 systemd 單元狀態。我將從 go-systemd
庫收到以下消息:
process org.freedesktop.systemd1 exited with status 1
登錄后復制
現在,當我重新啟動程序時,它將立即能夠毫無錯誤地查詢 systemd 單元。這導致我假設我的程序存在錯誤/配置錯誤的依賴項,因此在啟動時會出現競爭條件,導致程序無法通過 dbus 與 systemd 進行通信。
現在我已經把這個和其他幾個組合放在一起了,但是它沒有幫助:
Requires=dbus.service After=dbus.service Wants=org.freedesktop.systemd1
登錄后復制
我需要如何配置我自己的 systemd 單元(go 程序的),以便它能夠在重新啟動后立即通過 dbus 與 systemd 進行通信?我必須配置什么依賴項?
解決方法
聽起來您的程序默認情況下正在嘗試連接到 DBus Session 總線,因為您說手動運行它時它工作正常。當應用程序從 Systemd 啟動時,默認情況下它將以 root 身份運行,沒有可連接的會話總線,因此它將失敗。
當用戶在圖形終端上登錄時,會話總線通常在每次登錄的基礎上啟動。在終端登錄時默認不會啟動。
如果是這種情況,我目前可以看到您有兩個選擇:
-
使用系統總線而不是會話總線。
創建您自己連接的總線,不同于會話總線和系統總線。最簡單的方法是使用
dbus-launch
創建您的應用程序可以連接到的新總線。