Meu cenário é que desejo usar rtcwake -m no
para acordar meu computador enquanto estou dormindo e usar systemd/systemd-suspend
scripts para acionar smplayer
para me acordar com uma fila de podcasts.
Minha dificuldade é que smplayer
não consigo rodar ao acordar porque o Ubuntu carrega a tela de login e está aguardando um login. Existe uma maneira de fazer login programaticamente? Caso contrário, posso de alguma forma executar um programa GUI, como smplayer
usuário rootenquantoa tela de login é exibida? (Até agora, não está funcionando dessa maneira.)
(Não desejo suspender o computador para uma simples suspensão, nunca efetuando logout, porque não quero saber com antecedência quando suspender/colocar meu computador em suspensão, que estou fazendo isso pela última vez de o dia. Para ser claro, não quero fazer login automaticamente em todos os casos, apenas quando o computador for ativado para esse fim.)
Estou no LTS 16.
Responder1
Você pode usar xdotool
para fazer login, mas há algumas coisas a serem lembradas:
- Para que a janela da tela de login seja selecionada para xdotool, você precisa definir a
XAUTHORITY
variável para o.Xauthority
arquivo que corresponde ao seu usuário (geralmente/home/myuser/.Xauthority
. Defina também aDISPLAY
variável. Veja o exemplo de código abaixo. - Execute
xdotool
como o usuário que fará o login. (Seu script será executado como root. Na verdade, ele será executado como seu usuário logado em algumas circunstâncias, como causar sleep by/lib/systemd/systemd-sleep suspend
, mas em circunstâncias normais, ou sejasystemctl suspend
, será executado como root.) - Para fazer isso disparar apenas quando o seu alarme for a causa do seu despertar, use a
linux/rtc.h
API para comparar a hora atual da máquina (RTC_RD_TIME
) com a hora do alarme (RTC_ALM_READ
) ON/dev/rtc0
. Se eles estiverem próximos quando o script forsystemd/system-sleep
executado, você pode supor que se trata de uma ativação acionada por alarme.
Código de amostra:
#!/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