
Tengo un demonio, implementado en bash y ejecutándose mediante cron
la @reboot
opción que muestra el escritorio en inactividad. El guión es el siguiente (los tiempos son breves 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, puse las siguientes líneas al principio del script:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Entonces, el script espera que el usuario (la variable USUARIO está configurada con mi nombre de usuario en el archivo crontab) se registre. 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 modo 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) es agregar 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 objetivocomando del administrador de windows. Supongo que, si elcomando del administrador de windowsse está ejecutando en el sistema, significa que el escritorio está completamente cargado y 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" mediante otras solicitudes del sistema. Sin embargo, para mí es suficiente definir WM_CMD en el archivo crontab.
Respuesta1
Intente utilizar D-Bus para consultar la información de la sesión del logind
servicio. Tiene org.freedesktop.login1.Manager
interfaz con varias señales como SessionNew
y SeatNew
. org.freedesktop.login1.Seat
e org.freedesktop.login1.User
interfaces. Puede ayudar a obtener el estado de Sesión/Asiento/Usuario.
Respuesta2
Utilice el script de inicio de sesión ~/.xprofile
para crear un archivo de bandera para usted. Ya sea ~/.xlogin_flag
, luego en su otro script use inotifywatch
from paquete inotify-tools
para ver cómo se crea, toca o elimina.
Respuesta3
Verifique la salida del w
comando. Verá el tipo de inicio de sesión (pantalla X) en el campo LOGIN@.
Respuesta4
Verifique el directorio de tiempo de ejecución de lightdm. En Arch con systemd y lightdm, cuando un usuario inicia sesión, se crea un archivo xauthority.
$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl carl 60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl carl 55 Dec 11 19:40 xauthority
Podrías probar esto con algo como esto en tu bucle while.
[[ -f /run/lightdm/${USER}/xauthority ]] && continue