GNU/Linux >> Linux Esercitazione >  >> Linux

Eseguire un comando quando il sistema è inattivo e quando è di nuovo attivo

Questo thread sui forum di ArchLinux contiene un breve programma C che interroga l'xscreensaver per informazioni su quanto tempo l'utente è rimasto inattivo, questo sembra essere abbastanza vicino alle tue esigenze:

#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);
}

Salvalo come getIdle.c e compilare con

gcc -o getIdle getIdle.c -lXss -lX11

per ottenere un file eseguibile getIdle . Questo programma stampa il "tempo di inattività" (l'utente non si muove/fa clic con il mouse, non usa la tastiera) in millisecondi, quindi uno script bash che si basa su questo potrebbe apparire così:

#!/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

Questo necessita ancora di sondaggi regolari, ma fa tutto ciò di cui hai bisogno...


TMOUT in bash terminerà una sessione interattiva dopo il numero di secondi impostato. Puoi usare quel meccanismo.

Puoi catturare il logout impostando una trap corrispondente (non l'ho testato) o usando gli script bash-logout (~/.bash_logout).

Ecco una buona risposta da superutente in quella direzione.


Questo non è proprio quello che hai chiesto, ma c'è sempre il batch -command (di solito un'invocazione speciale del comando at -command e utilizzando il atd -daemon).

batch ti consente di avviare un comando da eseguire quando la media del carico scende al di sotto di un certo limite (di solito 1,5, ma questo può essere impostato all'avvio di atd ). Con at è anche possibile indicare un lavoro in modo tale che invece di essere eseguito in un determinato momento; il lavoro è appena stato consegnato a batch in quel momento, e viene eseguito per la prima volta quando la media del carico scende (ad es. viene eseguito non appena la media del carico scende sotto 1,5 qualche volta dopo le 2:00).

Sfortunatamente un processo batch verrà quindi eseguito fino alla fine, non si fermerà se il computer non è più inattivo.

+++

Se devi seguire il percorso di programmazione (che sembra dalle altre risposte), penso che proverei a creare qualcosa di simile al atd o crond demoni, che monitoravano gli utenti loggati e/o il carico medio. Questo demone potrebbe quindi eseguire script/programmi da una determinata directory e avviarli/continuarli o interromperli (con segnali) secondo necessità.


Linux
  1. Utilizzo del comando timedatectl per modificare l'ora e la data sul sistema Linux RHEL7

  2. Come eseguire un comando come amministratore di sistema (root)?

  3. Come eseguire un comando quando il contenuto di una directory viene aggiornato?

  4. Cosa succede quando eseguo il comando Cat /proc/cpuinfo?

  5. Ssh su più host ed eseguire un comando?

Come scoprire chi ha riavviato il sistema Linux e quando

Come identificare il sistema operativo utilizzando il valore TTL e il comando ping

Comandi importanti per visualizzare le informazioni sull'hardware e sul sistema in Linux

40 “lsof Command” semplice ed efficace nel sistema Linux

Come installare e utilizzare il comando Ack nel sistema Linux

Come eseguire i pacchetti .run e .bin nel sistema Linux