您如何通過 mosh 保持 systemd 使用者服務的活力?
我在我的 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 在其新的守護程序模式下存在問題、氾濫等。 不過,它們不在此答案的範圍內。)
logind
systemd 的概念是, bodge PAM 外掛將登錄會話的設置和關閉傳遞給離開。這與您用來啟動的 SSH 會話一起生效
mosh-server
。但是該會話是短暫的,並且在mosh-server
啟動並執行之後完成。mosh-server
此外,它不是登錄程序,與 PAM 沒有任何交易,因此 bodge PAM 外掛不起作用。結果是logind
只看到一個非常短暫的 SSH 會話,因此啟動然後又快速停止您的每使用者服務管理子系統。systemd 處理此問題的唯一方法是告訴
logind
您的每使用者服務管理在最終註銷後“徘徊”。您可以使用enable-linger
命令的子命令執行此操作loginctl
。此外,這不僅適用於 mosh。任何涉及短期 SSH 會話的系統,尤其是涉及大量會話的系統,都會存在
logind
一遍又一遍地啟動和停止每使用者服務管理的問題。進一步閱讀