Systemd

如何在從 S3 睡眠(掛起)或 S4 睡眠(休眠)喚醒後自動執行 X 程序?

  • September 5, 2022

現有問題如何在 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

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