目前版本的 Xorg 是否偵聽正在關閉的 systemd-login 會話?
Xorg 與 systemd-logind 集成,允許它有效地打開所需的設備,而無需以超級特權
root
使用者身份執行。當 systemd-logind 會話結束時,systemd-logind 撤銷 Xorg 對設備的訪問(撤銷文件描述符$$ 1 $$). 但是結束會話真的會導致 Xorg 退出嗎?
這個問題是從 Fedora 26 版 xorg-x11-server-Xorg-1.19.3-4.fc26.x86_64 開始編寫的。
$$ 1 $$或者從技術上講,我認為 logind 會撤銷打開設備時創建的描述。文件描述符是每個程序的;logind 不能直接影響Xorg 程序中的描述符。
不會。程式碼不會監聽它,它可以在不訪問任何設備的情況下繼續愉快地執行(並且不期望重新獲得訪問權限)。我相信這是 Xorg 與 systemd-logind 集成的疏忽。
目前 Xorg 需要在與會話關聯的“範圍”單元中執行。儘管它可以擴展為接受 XDG_SESSION_ID 環境變數。這就是最初引發我的問題的原因。
如果會話以會話領導者(第一個程序)退出而結束,則只有在上游預設 KillUserProcesses=yes 已保留時,範圍才會停止
logind.conf
。否則,會話將被“放棄”,允許 GNU Screen 等程序tmux
繼續執行。大多數發行版禁用 KillUserProcesses;這是一個非常值得懷疑的預設設置。
loginctl terminate-session
將始終停止範圍單元。雖然,停止範圍單元最初會發送 SIGHUP,顯然是因為“bash 和朋友”傾向於忽略 SIGTERM。由於某些原因。Xorg 和許多守護程序一樣,特別對待 SIGHUP。Xorg 將 SIGHUP 視為重置伺服器的信號,而不是退出。我認為這意味著 systemd 將在超時後發送 SIGKILL 並且 Xorg 仍未退出。Xorg 將在沒有適當清理的情況下被強行殺死。重現 Xorg 不退出的步驟:
nohup /usr/libexec/Xorg :5 vt5 -keeptty -novtswitch
以非 root 使用者身份執行。(vt5 假設您從文本控制台 5 執行它,AKA ctrl+alt+f5)。- 切換到不同的文本控制台。登錄。使用
ps -ax | grep bash
查找在 上執行的 bash shell 的 PIDtty5
。跑kill -SIGHUP <PID>
- bash 程序退出,註銷您的會話。如果切換回 VT 5,您將看到控制台登錄提示。但 Xorg 程序實際上仍在執行!
在這個 Xorg 實例的日誌文件中,您會看到它試圖釋放並重新打開它仍然認為屬於它的所有設備。這就是 Xorg 重置時發生的情況。會話結束後,沒有任何設備可供它使用,因此所有打開設備的嘗試都失敗了。
Xorg 重置,因為它被發送 SIGHUP(儘管
nohup
:-)。我注意到了這一點,因為我已經依附於gdb
它。收到 SIGHUP 是因為 Xorg 重新打開了/dev/tty5
自己,將其作為“控制終端”獲取。您可以在 中看到控制終端ps -ax | grep Xorg
。當您殺死 bash 以強制註銷時,系統會在 TTY 上生成掛斷 (HUP)。除非您設置了 KillUserProcesses,否則不會向 Xorg 發送比 SIGHUP 更強大的內容。如果沒有
novtswitch
,復位也會嘗試切換 VT。但是非根 X 永遠不能改變活動的 VT。由於步驟 3 是從不同的 VT 執行的,因此此 VT 切換嘗試將失敗。切換 VT 失敗會導致 Xorg 退出。在
nohup
這些步驟中是必需的,否則 Xorg 將被終止。這與 shell 作業管理有關。證明:如果你不使用 Xorg 也會繼續執行nohup
,而是使用命令禁用作業管理set +m
。