Systemd

目前版本的 Xorg 是否偵聽正在關閉的 systemd-login 會話?

  • October 22, 2017

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 不退出的步驟:

  1. nohup /usr/libexec/Xorg :5 vt5 -keeptty -novtswitch以非 root 使用者身份執行。(vt5 假設您從文本控制台 5 執行它,AKA ctrl+alt+f5)。
  2. 切換到不同的文本控制台。登錄。使用ps -ax | grep bash查找在 上執行的 bash shell 的 PID tty5。跑kill -SIGHUP <PID>
  3. 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

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