我的場景是,我希望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 身分執行。實際上,在某些情況下它會以你的登入使用者身分執行,例如導致 sleep by/lib/systemd/systemd-sleep suspend
,但在一般情況下,即systemctl suspend
,它將以 root 身分執行。)- 若要使其僅在鬧鐘導致喚醒時觸發,請使用 API
linux/rtc.h
將電腦的當前時間 (RTC_RD_TIME
) 與鬧鐘時間 (RTC_ALM_READ
) ON進行比較/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