Quiero ejecutar un comando cuando el usuario se vuelve inactivo (el sistema está inactivo). Por ejemplo:
echo "You started to be inactive."
Además, cuando el usuario vuelve a estar activo (el sistema ya no está inactivo):
echo "You started to be active, again."
Necesito un script de shell que haga esto. ¿Es esto posible sin un temporizador / intervalo? Tal vez algunos eventos del sistema?
Respuestas:
Este hilo en los foros de ArchLinux contiene un breve programa en C que consulta el xscreensaver para obtener información sobre cuánto tiempo ha estado inactivo el usuario, esto parece estar bastante cerca de sus requisitos:
Guarda esto como
getIdle.c
y compila conpara obtener un archivo ejecutable
getIdle
. Este programa imprime el "tiempo de inactividad" (el usuario no se mueve / hace clic con el mouse, no usa el teclado) en milisegundos, por lo que un script bash que se basa en esto podría verse así:Esto todavía necesita un sondeo regular, pero hace todo lo que necesita ...
fuente
xprintidle
, que está disponible en la mayoría de las distribuciones y hace exactamente lo mismo.TMOUT en bash finalizará una sesión interactiva después del número de segundos establecido. Puedes usar ese mecanismo.
Usted migth captura el cierre de sesión configurando una trampa correspondiente (no lo probé), o utilizando los scripts bash-logout (~ / .bash_logout).
Aquí hay una buena respuesta de superusuario en esa dirección.
fuente
$TMOUT
hayan pasado segundos.EXIT
trampa o desde.bash_logout
.Esto no es exactamente lo que solicitó, pero siempre existe el
batch
comando-(generalmente una invocación especial delat
comando y el uso delatd
demonio).batch
le permite ejecutar un comando para que se ejecute cuando el promedio de carga cae por debajo de un cierto límite (generalmente 1.5, pero esto se puede configurar al iniciaratd
). Conat
también es posible indicar un trabajo de tal manera que en lugar de ejecutarse en un momento determinado; el trabajo se acaba de entregarbatch
en ese momento y se ejecuta primero cuando el promedio de carga cae (por ejemplo, se ejecuta tan pronto como el promedio de carga cae por debajo de 1.5 en algún momento después de las 2:00 a.m.).Desafortunadamente, un trabajo por lotes se ejecutará hasta el final, no se detendrá si la computadora ya no está inactiva.
+++
Si tiene que ir a la ruta de programación (que parece de las otras respuestas), creo que trataría de hacer algo similar a los
atd
ocrond
daemons, que monitoreó a los usuarios registrados y / o al promedio de carga. Este demonio podría ejecutar scripts / programas desde un determinado directorio y comenzar / continuar o detenerlos (con señales) según sea necesario.fuente
.lock
archivos, podrías manejar fácilmente los problemas de sincronización.Este hilo tiene un par de soluciones basadas en la detección de la actividad del teclado y el mouse. Corro
xprintidle
de un trabajo cron que comienza cada pocos minutos. Pero, como señalan,xprintidle
no se mantiene, por lo que es posible que desee instalar el módulo Perl y usarlo en su lugar:Usaría cualquier solución sondeando desde cron, en un script que sale en la parte superior si la interfaz de usuario no ha estado lo suficientemente inactiva. Por supuesto, el script necesitaría un
export DISPLAY=:0.0
para poder hablar con X11.Recuerde que su teclado y mouse pueden estar inactivos al mirar una película o al ejecutar una tarea con mucha CPU.
fuente
No conozco una manera de hacer esto sin sondear algún tipo de estadísticas del sistema, como las otras respuestas usan un protector de pantalla o un temporizador inactivo bash, o se ejecutan desde .bash_logout, pero aquí hay una idea para verificar el uso de la CPU.
Esto aún implicaría sondear cada n segundos, y si el uso de su CPU está por debajo de la cantidad que elija, entonces puede escribir lo que quiera ejecutar. Sin embargo, lo que sea que ejecute podría aumentar el uso de la CPU, pero podría usar bien sus "cosas" para no contarlo.
Aquí hay un script de prueba que usa top, pero ¿podrías usar mpstat en su lugar o verificar los promedios de carga?
Ese es solo un guión que elaboré para probar leer el inactivo desde arriba. Podría analizar,
/proc/stat
pero creo que solo muestra los tiempos totales, y necesitaría comparar los resultados en un intervalo. Top tiene su propio problema para mí (Linux mint 16), en la primera ejecución parece que nunca cambia los cpustats, como si tuviera que esperar para analizar / proc / stat en sí mismo, por lo tanto,top -bn2
pero en teoríatop -bn1
debería funcionar.fuente
w
comando que muestra el tiempo de inactividad del usuario. - Por cierto, no estoy juzgando, es solo eso para mí, quiero detectar inactivo para poner la máquina en reposo, ahorrar energía, y las encuestas van en contra de eso.