现有问题如何在 systemd 唤醒后运行用户脚本?已经有允许从睡眠唤醒后运行脚本的答案。然而,为该问题提供的解决方案需要对用户进行硬编码。
如何创建一个由所有当前记录的图形桌面会话自动运行的脚本?(也就是说,当使用快速用户切换/“切换帐户”在不同的虚拟终端上并行运行多个桌面时,应该使用正确的环境变量值 和 运行每个用户的脚本DISPLAY
。XAUTHORITY
)
我个人用于lightdm
创建新会话/登录回现有会话,但我更喜欢独立于显示管理器的解决方案。
答案1
在恢复时,您可以枚举登录的 X.org 用户并运行他们所需的任何内容。关于如何获取当前登录用户列表的解决方案有很多,但大多数都已经过时,并且可能无法在现代 Linux 发行版中工作,包括:w
、who
和last
,例如,在我的 Fedora 36 机器上什么也不返回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