首頁 >後端開發 >Golang >如何將 dbus/systemd 設定為 systemd 單元中的依賴項

如何將 dbus/systemd 設定為 systemd 單元中的依賴項

PHPz
PHPz轉載
2024-02-12 09:10:21829瀏覽

如何将 dbus/systemd 设置为 systemd 单元中的依赖项

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 身分執行,沒有可連接的會話匯流排,因此它將失敗。

當使用者在圖形終端上登入時,會話匯流排通常會在每次登入的基礎上啟動。在終端登入時預設不會啟動。

如果是這種情況,我目前可以看到您有兩個選擇:

  1. 使用系統匯流排而不是會話匯流排。
  2. 建立您自己連接的匯流排,不同於會話匯流排和系統匯流排。最簡單的方法是使用 dbus-launch 建立您的應用程式可以連接到的新匯流排。

以上是如何將 dbus/systemd 設定為 systemd 單元中的依賴項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除