Мой сценарий заключается в том, что я хочу использовать 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
) 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