¿Cómo detectar desde el script cuando se carga el escritorio del usuario?

11

Tengo un demonio, implementado en bash y ejecutándose mediante crony la @rebootopció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 xprintidley wmctrlfalla 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 greplí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 crontablinea:

 @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.

Peregring-lk
fuente
¿Qué administrador de inicio de sesión estás usando?
mtahmed
Mi administrador de inicio de sesión eslightdm
Peregring-lk
Esta pregunta de Superusuario podría serle de ayuda. Sin embargo, no estoy seguro de que responda su pregunta por completo.
Rany Albeg Wein
1
No es particularmente robusto, pero podría verificar el proceso de Gnome / KDE ...
jasonwryan
1
Debe documentar lo que hizo como respuesta; Puede ayudar a otros.
jasonwryan

Respuestas:

2

Intente utilizar D-Bus para consultar la información de sesión del logindservicio. Tiene org.freedesktop.login1.Managerinterfaz con varias señales como SessionNewy SeatNew. org.freedesktop.login1.Seate org.freedesktop.login1.Userinterfaces. Puede ayudar a obtener el estado de sesión / asiento / usuario.

loco
fuente
1

Use la secuencia ~/.xprofilede comandos de inicio de sesión para crear un archivo de marca para usted. Sea así ~/.xlogin_flag, luego, en su otro script, use el inotifywatchpaquete inotify-toolspara ver cómo se crea, toca o elimina.

Grzegorz Żur
fuente
1

Verifique la salida del wcomando. Verá el tipo de inicio de sesión (pantalla X) en el campo LOGIN @.

Grzegorz Żur
fuente
1

Creo que la forma más simple de verificar si un usuario está conectado en X11 es verificar los procesos en los que se escribe, $HOME/.xsession-errorsya que cuando inicia sesión gráficamente, todo lo que stderr se redirige allí.

De lo contrario, simplemente use el wcomando, como ya sugirió @Grzegorz: si la FROMcolumna comienza con, :entonces es una sesión gráfica.

eppesuig
fuente
0

Consulte 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

Puede probar esto con algo como esto en su ciclo while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
carlwgeorge
fuente