Systemd
如何在從 S3 睡眠(掛起)或 S4 睡眠(休眠)喚醒後自動執行 X 程序?
現有問題如何在 systemd 喚醒後執行使用者腳本?已經有了允許從睡眠中喚醒後執行腳本的答案。但是,為該問題提供的解決方案需要硬編碼使用者。
如何創建由所有目前記錄的圖形桌面會話自動執行的腳本?(也就是說,當使用快速使用者切換/“切換帳戶”在不同的虛擬終端上並行擁有多個桌面時,腳本應該與每個使用者一起執行,並為
DISPLAY
和設置正確的環境變數值XAUTHORITY
。)我個人
lightdm
用於創建新會話/重新登錄到現有會話,但我更喜歡顯示管理器獨立的解決方案。
在簡歷中,您可以列舉登錄的 X.org 使用者並執行您需要的任何內容。有許多關於如何獲取目前登錄使用者列表的解決方案,但其中大多數已經過時,可能無法在現代 Linux 發行版中執行,包括:和
w
,例如,在我的 Fedora 36 機器上不返回任何內容。顯示最後一個:who``last``w``who``last``reboot
last | head -1 reboot system boot 5.19.4-az2 Sun Sep 4 01:56 still running
如果它們對您有用,您可以使用它們。
這是一種現代方法,它必須在 2022 年 9 月開始工作(Linux 的時間戳答案總是一個好主意):
$ loginctl --no-legend list-sessions # or run it without any parameters SESSION UID USER SEAT TTY 2 1000 birdie seat0 tty7
或者
gdbus
,如果您喜歡程式:$ gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.ListSessions ([('2', uint32 1000, 'birdie', 'seat0', objectpath '/org/freedesktop/login1/session/_32')],)
讓我們繼續合作
loginctl
。您可能需要了解 Xorg 為使用者顯示的內容,您可以這樣做:#! /bin/bash for session in `loginctl --no-legend list-sessions | awk '{print $1}'`; do echo -e "ID\tName\tDisplay" eval `loginctl show-session $session | egrep '^Display|^User|^Name'` echo -e "$User\t$Name\t$Display" done # output ID Name Display 1000 birdie :0
而不是
echo
語句,您可以執行您需要的,例如export XAUTHORITY="`getent passwd $Name | cut -f6 -d:`/.Xauthority" export DISPLAY=$Display command