GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecute un comando cuando el sistema esté inactivo y cuando esté activo nuevamente

Este hilo en los foros de ArchLinux contiene un breve programa en C que consulta xscreensaver para obtener información sobre cuánto tiempo ha estado inactivo el usuario, esto parece estar bastante cerca de sus requisitos:

#include <X11/extensions/scrnsaver.h>
#include <stdio.h>

int main(void) {
    Display *dpy = XOpenDisplay(NULL);

    if (!dpy) {
        return(1);
    }

    XScreenSaverInfo *info = XScreenSaverAllocInfo();
    XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
    printf("%u\n", info->idle);

      return(0);
}

Guardar esto como getIdle.c y compilar con

gcc -o getIdle getIdle.c -lXss -lX11

para 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 de bash que se basa en esto podría tener este aspecto:

#!/bin/bash

idle=false
idleAfter=3000     # consider idle after 3000 ms

while true; do
  idleTimeMillis=$(./getIdle)
  echo $idleTimeMillis  # just for debug purposes.
  if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
    echo "start idle"   # or whatever command(s) you want to run...
    idle=true
  fi

  if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
    echo "end idle"     # same here.
    idle=false
  fi
  sleep 1      # polling interval

done

Esto todavía necesita un sondeo regular, pero hace todo lo que necesita...


TMOUT en bash finalizará una sesión interactiva después del número de segundos establecido. Puede usar ese mecanismo.

Puede capturar el cierre de sesión configurando una trampa correspondiente (no probé eso), o usando los guiones de cierre de sesión de bash (~/.bash_logout).

Aquí hay una buena respuesta de superusuario en esa dirección.


Esto no es exactamente lo que pediste, pero siempre está el batch -comando (generalmente una invocación especial del at -comando y usando el atd -demonio).

batch le permite activar un comando para que se ejecute cuando el promedio de carga caiga por debajo de cierto límite (generalmente 1.5, pero esto se puede configurar al iniciar atd ). Con at también es posible indicar un trabajo de tal manera que, en lugar de ejecutarse en un momento determinado; el trabajo acaba de entregarse a batch en ese momento, y primero se ejecuta 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 am).

Desafortunadamente, un trabajo por lotes se ejecutará hasta el final, no se detendrá si la computadora ya no está inactiva.

+++

Si tiene que seguir la ruta de programación (que se parece a las otras respuestas), creo que intentaría hacer algo similar al atd o crond demonios, que monitoreaban usuarios registrados y/o promedio de carga. Este demonio podría ejecutar secuencias de comandos/programas desde un directorio determinado e iniciarlos/continuarlos o detenerlos (con señales) según sea necesario.


Linux
  1. Uso del comando timedatectl para cambiar la hora y la fecha en el sistema RHEL7 Linux

  2. 10 usos asombrosos y misteriosos de (!) símbolo u operador en los comandos de Linux

  3. ¿Cómo ejecutar un comando como administrador del sistema (raíz)?

  4. ¿Cómo ejecutar un comando cuando se actualizan los contenidos de un directorio?

  5. ¿Qué sucede cuando ejecuto el comando Cat /proc/cpuinfo?

Cómo encontrar quién reinició el sistema Linux y cuándo

Cómo identificar el sistema operativo usando el valor TTL y el comando ping

Comandos importantes para ver la información del hardware y del sistema en Linux

40 Comando lsof simple y efectivo en el sistema Linux

Cómo instalar y usar el comando Ack en el sistema Linux

Cómo ejecutar paquetes .run y .bin en el sistema Linux