如何从S3睡眠(挂起)或S4睡眠(休眠)唤醒后自动运行X程序?

如何从S3睡眠(挂起)或S4睡眠(休眠)唤醒后自动运行X程序?

现有问题如何在 systemd 唤醒后运行用户脚本?已经有允许从睡眠唤醒后运行脚本的答案。然而,为该问题提供的解决方案需要对用户进行硬编码。

如何创建一个由所有当前记录的图形桌面会话自动运行的脚本?(也就是说,当使用快速用户切换/“切换帐户”在不同的虚拟终端上并行运行多个桌面时,应该使用正确的环境变量值 和 运行每个用户的脚本DISPLAYXAUTHORITY

我个人用于lightdm创建新会话/登录回现有会话,但我更喜欢独立于显示管理器的解决方案。

答案1

在恢复时,您可以枚举登录的 X.org 用户并运行他们所需的任何内容。关于如何获取当前登录用户列表的解决方案有很多,但大多数都已经过时,并且可能无法在现代 Linux 发行版中工作,包括:wwholast,例如,在我的 Fedora 36 机器上什么也不返回w。显示最后一个:wholastreboot

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

相关内容