Systemd

您如何通過 mosh 保持 systemd 使用者服務的活力?

  • August 17, 2017

我在我的 Arch 機器上設置了一些服務(例如 syncthing)作為使用者級 systemd 服務。當我進入時它們工作ssh得很好,但是當我使用 連接時mosh,它們似乎開始然後又立即停止。例如,我可以連接 mosh,然後systemctl --user status syncthing返回它正在執行或關閉的資訊;然後,重複命令,我得到

Failed to connect to bus: No such file or directory

基於其他類似的問題,我檢查了$XDG_RUNTIME_DIR在 mosh 會話中設置的內容:

$ echo $XDG_RUNTIME_DIR
/run/user/1000

確實,使用者管理器似乎乾淨地關閉了,即使我仍然連接到會話:

$ systemctl status user@1000.service
● user@1000.service - User Manager for UID 1000
  Loaded: loaded (/usr/lib/systemd/system/user@.service; static; vendor preset: disabled)
  Active: inactive (dead)

[...]
Aug 16 18:36:56 ip-172-70-3-138 systemd[7804]: Closed GnuPG cryptographic agent and passphrase cache (restricted).
Aug 16 18:36:56 ip-172-70-3-138 systemd[7804]: Reached target Shutdown.
Aug 16 18:36:56 ip-172-70-3-138 systemd[7804]: Starting Exit the Session...
Aug 16 18:36:56 ip-172-70-3-138 systemd[7804]: Received SIGRTMIN+24 from PID 7877 (kill).
Aug 16 18:36:56 ip-172-70-3-138 systemd[1]: Stopped User Manager for UID 1000.

如何讓服務保持活力?


更新: Tmux 會話本身不會啟動或保持 systemd 服務處於活動狀態,至少在我的系統上是這樣。我無法確定這是否是正確的行為,但在我看來,tmux 會話應該阻止 systemd 關閉。考慮我正在使用 編輯文件的情況emacsclient: 我希望如果我的連接中斷一分鐘,無論使用 mosh 還是 tmux,emacs 守護程序都會保持活動狀態。

再一次,systemd 的使用者空間登錄會話的概念與 mosh 等程序的工作方式之間存在不匹配。(這遠不是唯一的這樣的衝突 。tmux、screen、emacs 在其新的守護程序模式下存在問題、氾濫等。 不過,它們不在此答案的範圍內。)

logindsystemd 的概念是, bodge PAM 外掛將登錄會話的設置和關閉傳遞給離開。

這與您用來啟動的 SSH 會話一起生效mosh-server。但是該會話是短暫的,並且在mosh-server啟動並執行之後完成。 mosh-server此外,它不是登錄程序,與 PAM 沒有任何交易,因此 bodge PAM 外掛不起作用。結果是logind只看到一個非常短暫的 SSH 會話,因此啟動然後又快速停止您的每使用者服務管理子系統。

systemd 處理此問題的唯一方法是告訴logind您的每使用者服務管理在最終註銷後“徘徊”。您可以使用enable-linger命令的子命令執行此操作loginctl

此外,這不僅適用於 mosh。任何涉及短期 SSH 會話的系統,尤其是涉及大量會話的系統,都會存在logind一遍又一遍地啟動和停止每使用者服務管理的問題。

進一步閱讀

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