Tengo un demonio, implementado en bash y ejecutándose mediante cron
y la @reboot
opción, que muestra el escritorio en inactividad. El script es el siguiente (los tiempos son cortos para fines de prueba):
#!/bin/bash
P_STATE=0
while :
do
sleep 5
if [ $P_STATE == 0 ]; then
[ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
else
[ `xprintidle` -le 25000 ] && P_STATE=0
done
Problema: si un usuario todavía está, por ejemplo, en la pantalla de inicio de sesión xprintidle
y wmctrl
falla porque el escritorio aún no está cargado. Para evitar esto, he puesto las siguientes líneas al comienzo del script:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Entonces, la secuencia de comandos espera al usuario (la variable USUARIO se establece en mi nombre de usuario en el archivo crontab) se registra. Pero, si un usuario comienza, por ejemplo, una sesión de terminal (y no una sesión gráfica como KDE o GNOME), el script también continúa.
¿Cómo puedo determinar si un usuario ya está en una sesión "gráfica" capaz de "mostrar el modo de escritorio" o no? Y además, ¿cómo puedo asegurarme de que una sesión "gráfica" esté completamente cargada y no en proceso de carga o algo así?
Mi solución: mi solución
(informal) está agregando en el bucle principal la grep
línea:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Siendo "$ WM_CMD" el comando del administrador de Windows de destino . Supongo que, si el comando del administrador de Windows se está ejecutando en el sistema, significa que el escritorio está completamente cargado y que cualquier comando "gráfico" es seguro.
¿Dónde se define la variable WM_CMD? En la crontab
linea:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Pero también creo que sería posible detectar el "comando del administrador de Windows" por medio de otras solicitudes del sistema. Sin embargo, para mí, definir WM_CMD en el archivo crontab es suficiente.
lightdm