如何設定 OpenRC 服務在「登入」層級運作?

如何設定 OpenRC 服務在「登入」層級運作?

我希望 OpenRC 的特定服務在我的用戶透過agetty、LightDM(顯示管理器)或任何其他方式登入後運行。

這是因為我有一個 emacs 守護程序作為 OpenRC 服務為我的特定用戶運行,並且我需要該服務僅在創建 dbus 會話後啟動。實現此目的的一種方法是在 dbus-launch 之後運行 emacs 守護進程(相關歷史)執行我的主會話(目前是 XFCE 會話),例如在透過 LightDM 顯示管理器登入後發生。

我所做的解決方法是:使用我的用戶登入後重新啟動 emacs,以正確初始化 dbus 與 emacs 的整合。但這只是痛苦的。一定有更好的方法來做到這一點。

答案1

Gentoo wiki 有描述啟動使用者服務的各種方式的頁面在使用 OpenRC 的系統上,但即使您不使用 Gentoo,您也可以將這些方法中的任何一種應用於您的系統。有幾種不同的選項,取決於您的需求:

  • 使用桌面環境的自動啟動功能(如果可用)。 (我不使用 XFCE,所以我不確定它是否具有此功能。)如果它有效,這可能是最簡單的設定選項,特別是如果您的服務需要連接到 DBUS 守護進程,因為它會自動繼承告訴它如何從XFCE 存取DBUS 的環境變數。然而,它只有在您以圖形方式登入時才起作用,而不是使用agetty登錄,所以聽起來這不是您想要的。

  • 將守護程序新增為常規 OpenRC 服務(這表示在 中為其建立腳本/etc/init.d/),並設定 PAM 以在您登入或登出時啟動和停止該服務。即使您使用非圖形方法(如agetty 或SSH)登錄,這也會啟動該服務。但是,如果您這樣做,該服務將無法存取與 DBUS 相關的環境變數。

    您也許能夠動態檢測與 DBUS 相關的參數 - wiki 頁面中有一個腳本顯示瞭如何嘗試做到這一點 - 但這不是最強大的東西。當然,這依賴於有一個正在運行的 DBUS 守護程序可以連接,只有在您的桌面環境啟動它時才會發生這種情況。如果沒有,那麼您需要弄清楚您的服務應該做什麼(例如,它應該失敗嗎?它應該啟動自己的 DBUS 守護程序嗎?)並實現它。

  • 使用可以從自訂目錄執行服務的單獨服務管理員。 (wiki 頁面用作runsvdir此範例,但執行相同操作的任何其他程式都應該是可以接受的。)您可以透過前面提到的任何一種方式啟動服務管理員(由PAM 控制的OpenRC 服務,或者您的桌面環境的autostart),或從 shell 初始化檔案之一運行它,或將其作為不受 PAM 控制的 OpenRC 服務,並且像其他系統一樣在系統啟動時啟動,等等。然後,您可以在此自訂目錄中為您的 emacs 守護程序定義服務,並將命令放入一些適當的初始化檔案(shell 啟動、PAMxsession等)中,以告訴單獨的服務管理器根據需要啟動和停止該服務。

    這種方式可能為您提供了控制emacs 守護程序何時運行的最大靈活性,但它與前面提到的DBUS 存在相同的問題:單獨的服務管理器將無法訪問任何與DBUS 相關的環境變量,除非您從您的emacs 守護程式啟動它。因此,如果需要,您可能需要使用某種 DBUS 連線參數的動態偵測。

根據您的具體需求,這些方法中的一種或另一種可能適合您。無論您選擇哪一個,您都可以在連結的 wiki 頁面中找到有關如何實現它的更多詳細資訊。

答案2

是的,這是可能的。您只需添加sudo rc-service yourservice start到您的用戶的.bashrc.

答案3

rc-update add <service> <runlevel>

來源:https://wiki.gentoo.org/wiki/OpenRC_to_systemd_Cheatsheet

相關內容