我的情况是,我希望rtcwake -m no
在我睡觉时唤醒我的电脑,并使用systemd/systemd-suspend
脚本触发smplayer
以通过播客队列唤醒我。
我的问题是smplayer
无法在唤醒时运行,因为 Ubuntu 会加载登录屏幕并等待登录。有没有办法通过编程登录?如果没有,我能否以某种方式运行 GUI 程序,例如smplayer
以 root 用户身份运行尽管登录屏幕是否显示?(目前为止,还没有这样运行。)
(我不希望将计算机挂起到简单的睡眠状态,从而永远不注销,因为我不想在挂起/睡眠计算机时提前知道我是在一天中的最后一次这样做。要明确的是,我不想在所有情况下都自动登录,只在为此目的唤醒计算机时才自动登录。)
我在使用 LTS 16。
答案1
您可以使用xdotool
登录,但请注意以下几点:
- 为了为 xdotool 选择登录屏幕的窗口,您需要将变量设置
XAUTHORITY
为.Xauthority
与您的用户相对应的文件(通常是)/home/myuser/.Xauthority
。还要设置DISPLAY
变量。请参阅下面的代码示例。 - 以要登录的用户身份运行
xdotool
。(您的脚本将以 root 身份运行。实际上,在某些情况下,它会以您登录的用户身份运行,例如通过 导致睡眠/lib/systemd/systemd-sleep suspend
,但在一般情况下,即systemctl suspend
,它将以 root 身份运行。) - 要使此功能仅在闹钟是唤醒原因时触发,请使用 API
linux/rtc.h
将机器的当前时间 (RTC_RD_TIME
) 与闹钟时间 (RTC_ALM_READ
)进行比较/dev/rtc0
。如果脚本运行时它们很接近systemd/system-sleep
,那么您可以推测这是闹钟触发的唤醒。
示例代码:
#!/bin/sh
# /lib/systemd/system-sleep/myscript
# PW64 is a variable holding a base64-encoded password
if [ post = $1 ] && [ suspend = $2 ] && [ $(whoami) = root ]; then
if get_alm_time 10; then # this is an external program you should write to compare RTC_RD_TIME TO RTC_ALM_TIME
export XAUTHORITY=/home/mysuer/.Xauthority
export DISPLAY=:0
su -c "xdotool type $(printf $PW64 | base64 -d)" myuser &&\
su -c 'xdotool key Return' myuser &&\
su -c 'bash my-other-script.sh' myuser
fi
fi