Arch-Linux

如何設置使用者自動啟動並正確配置 systemd 使用者服務?

  • April 4, 2018

在我的 Arch 伺服器上,我將使用者設置為僅限於他們的主目錄。我跑了:

useradd -m -s /bin/bash usernamepasswd username

我讀過這篇維基文章…

我想我應該使用 systemd 使用者服務讓每個使用者在啟動時執行一個節點伺服器。所以我登錄了一個使用者帳戶su username並創建了一個文件~/.config/systemd/user/serve.service,其中包含:

[Unit]
Description=One of the servers

[Service]
ExecStart=/usr/bin/node /home/username/server.js

[Install]
WantedBy=default.target

然後我跑systemctl --user enable serve.serviceFailed to connect to bus: Permission denied

據我了解,我應該systemctl --user ...以使用者身份而不是 root 身份執行命令。

那麼我在這個配置中錯過了什麼?

所以我登錄了一個使用者帳戶su username

不,你沒有。

您沒有登錄。 您正在使用 增加現有登錄會話的權限su username

systemctl使用該--user選項定位您的每使用者桌面匯流排,由每使用者桌面匯流排守護程序管理,並通過該匯流排與您的每使用者實例進行通信,systemd該實例管理您的每使用者服務。

su不是登錄機制。它在現有的互動式登錄會話中工作。在該會話中,您的程序具有環境變數,這些變數告訴它們您的每使用者執行時目錄XDG_RUNTIME_DIR在哪裡 ( ),每使用者桌面匯流排在哪裡 ( DBUS_SESSION_BUS_ADDRESS),實際上還有其他資訊,例如 X 伺服器在哪裡 ( DISPLAY)。

特別是,DBUS_SESSION_BUS_ADDRESS可以隱式引用XDG_RUNTIME_DIR或顯式命名相同的路徑。該路徑通常類似於/run/user/1001/bus桌面匯流排代理的訪問套接字(例如,假設您的使用者 ID 是 1001)。

這些變數不會被 改變su。在這方面已經有很多年了,包括其他類似命令的行為,例如pkexec.

這樣做的結果是,如果您su在登錄會話中連接到第二個使用者,systemctl作為該第二個使用者執行時會嘗試連接到位於第一個使用者私有目錄中的桌面匯流排代理訪問套接字。使用者 1002(例如,為您的第二個使用者選擇使用者 ID)無法訪問/run/user/1001或其中的任何內容,即使 xe 對該目錄具有讀取+執行訪問權限,xe 也無法訪問/run/user/1001/bus,因為這也僅授予使用者 1001 訪問權限。

當然,這不是首先要與之交談的正確桌面匯流排代理。您想與第二個使用者的桌面匯流排代理對話,並通過它與第二個使用者的systemd.

簡單的解決方案是su將這些環境變數設置為適合第二個使用者帳戶的環境變數,指向第二個使用者的桌面匯流排:

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus su username -c 'systemctl --user'

當然,在這種情況下,我會使用一個方便的工具來設置它userenv,這使我不必手動輸入該匯流排地址:

su username -c 'userenv --set-dbus systemctl --user'

進一步閱讀

引用自:https://unix.stackexchange.com/questions/434494