Xorg

在不使用桌面環境或會話管理器的情況下,如何告訴 systemd-logind 會話不是空閒的?

  • December 6, 2020

我想logind用於電源管理。閒置 30 分鐘後,我希望電腦暫停。

問題是,現在,它會在 30 分鐘後掛起,即使我使用滑鼠和鍵盤活動也是如此。我的logind.conf

[Login]
HandlePowerKey=suspend
IdleAction=suspend
IdleActionSec=30min

我的 Ubuntu 15.04 設置非常小,我想保持這種狀態。我在控制台登錄(我不想要會話管理器),然後鍵入startx,它會啟動我~/.xinitrc的執行i3,我的首選視窗管理器。我不想使用桌面環境。

我希望電腦在給定的時間後掛起並鎖定。

所以,我的~/.config/i3/config文件包括:

exec "xss-lock -- i3lock -c 000000"

螢幕儲物櫃工作正常,集成良好。所以那裡沒有問題。

如果感興趣:

loginctl show-seat -p IdleHint

產量:

IdleHint=yes

如果我很活躍,似乎應該是“不”,對吧?

如果我這樣做:

gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c1 --method org.freedesktop.login1.Session.SetIdleHint false

或這個:

dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1/session/c1 "org.freedesktop.login1.Session.SetIdleHint" boolean:false

讀取 IdleHint 仍然會輸出“IdleHint=yes”!

那麼我錯過了什麼?systemd-logind在不使用會話管理器或桌面環境的情況下,如何在我處於活動狀態時避免掛起?

例如,我知道我可以使用lxqt-powermanagement,但我認為我認為這是不必要的是正確的。當然,我可以更改我個人對桌面環境的偏好,如有必要也會更改。不過,這個問題似乎可以解決。

當我做

dbus-send --system --print-reply \
 --dest=org.freedesktop.login1 /org/freedesktop/login1/session/self \
 "org.freedesktop.login1.Session.SetIdleHint" boolean:false

我明白了

Error org.freedesktop.DBus.Error.NotSupported: Idle hint control is not supported on non-graphical sessions.

這表明問題是登錄認為會話不是圖形的。確實:

$ loginctl show-session --property=Type self
Type=tty

這就是使用 sddm 有幫助的原因:它設置會話類型。

但是我們可以手動設置會話類型嗎?

org.freedesktop.login1 (5)說:

SetType() 允許動態更改會話的類型。它只能由會話的目前控制器呼叫。如果尚未呼叫 TakeControl(),則此方法將失敗。此外,一旦釋放控制,會話類型將重置為其原始值,方法是呼叫 ReleaseControl() 或關閉 D-Bus 連接。這應該有助於防止會話進入不一致的狀態,例如控制器崩潰時。唯一的參數類型是新的會話類型。

Xorg 伺服器成為會話控制器,但不設置類型,因此可能無法將其設置在其他地方(xinitrc、xsession 或類似的東西),因為只有會話控制器可以這樣做。

但是通過設置 pam_systemd(8) 有一種有點hack-ish$XDG_SESSION_TYPE方法。我嘗試將其放入/etc/systemd/system/getty@tty10.service.d/override.conf

[Service]
Environment=XDG_SESSION_TYPE=x11

現在,當我登錄 vt10 時exec startx /etc/X11/Xsession,可以更新 IdleHint 並且確實正在通過 xss-lock 進行更新。

為了使它更健壯一點,我的 .bash_profile 會檢查$XDG_SESSION_TYPE會話是否是主會話(只有一個會話應該將其環境變數推送到使用者 systemd 實例)並啟動 X,將 vt10 變成一個非常簡單的桌面管理器。:-)

#!bash

if [[ ! $DISPLAY && $XDG_SESSION_TYPE == "x11" ]]; then
       [[ "$(loginctl show-user --property=Display "$USER")" == "Display=$XDG_SESSION_ID" ]] && primary=: || primary=
       journal=(/usr/bin/systemd-cat --priority=info --stderr-priority=warning --level-prefix=false)
       [[ $primary ]] && session=(/etc/X11/xinit/xinitrc) || session=(~/.xsession)

       exec startx "${journal[@]}" "${session[@]}"
       exit 1
fi

. ~/.bashrc

可悲的是,缺乏答案可能意味著沒有答案。不過,很高興錯了!

對於那些可能正在研究相同事物的人,我最終屈服並使用了會話管理器。具體來說,sddm。現在,一切似乎都執行良好,會話管理器確實不是太臃腫,而且幾乎不礙事。

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