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
Respuestas:
Intente utilizar D-Bus para consultar la información de sesión del
logind
servicio. Tieneorg.freedesktop.login1.Manager
interfaz con varias señales comoSessionNew
ySeatNew
.org.freedesktop.login1.Seat
eorg.freedesktop.login1.User
interfaces. Puede ayudar a obtener el estado de sesión / asiento / usuario.fuente
Use la secuencia
~/.xprofile
de comandos de inicio de sesión para crear un archivo de marca para usted. Sea así~/.xlogin_flag
, luego, en su otro script, use elinotifywatch
paqueteinotify-tools
para ver cómo se crea, toca o elimina.fuente
Verifique la salida del
w
comando. Verá el tipo de inicio de sesión (pantalla X) en el campo LOGIN @.fuente
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-errors
ya que cuando inicia sesión gráficamente, todo lo que stderr se redirige allí.De lo contrario, simplemente use el
w
comando, como ya sugirió @Grzegorz: si laFROM
columna comienza con,:
entonces es una sesión gráfica.fuente
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.
Puede probar esto con algo como esto en su ciclo while.
fuente