Toto vlákno na fórech ArchLinux obsahuje krátký program v C, který se dotazuje xscreensaveru na informace, jak dlouho byl uživatel nečinný, zdá se, že je to docela blízko vašim požadavkům:
#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);
}
Uložte to jako getIdle.c
a zkompilujte pomocí
gcc -o getIdle getIdle.c -lXss -lX11
získat spustitelný soubor getIdle
. Tento program vytiskne "dobu nečinnosti" (uživatel se nepohybuje/nekliká myší, nepoužívá klávesnici) v milisekundách, takže bash skript, který na tom staví, by mohl vypadat takto:
#!/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
To stále vyžaduje pravidelné dotazování, ale dělá vše, co potřebujete...
TMOUT v bash ukončí interaktivní relaci po nastaveném počtu sekund. Tento mechanismus můžete použít.
Odhlášení můžete zachytit nastavením odpovídající pasti (to jsem netestoval) nebo pomocí bash-logout-scriptů (~/.bash_logout).
Zde je dobrá odpověď superuživatele tímto směrem.
To není přesně to, co jste požadovali, ale vždy existuje batch
-command (obvykle speciální vyvolání at
-příkaz a pomocí atd
-démon).
batch
umožňuje spustit příkaz, který se má spustit, když průměrná zátěž klesne pod určitý limit (obvykle 1,5, ale lze to nastavit při spuštění atd
). S at
je také možné spustit úlohu takovým způsobem, že spíše než aby byla spuštěna v určitou dobu; úloha je právě doručena na batch
v tu dobu a první spuštění, když průměrná zátěž klesne (např. se spustí, jakmile průměrná zátěž klesne pod 1,5 někdy po 2:00).
Bohužel dávková úloha pak poběží až do konce a nezastaví se, pokud počítač již není nečinný.
+++
Pokud musíte jít cestou programování (jak to vypadá z ostatních odpovědí), myslím, že bych zkusil vytvořit něco podobného jako atd
nebo crond
démoni, kteří monitorovali přihlášené uživatele a/nebo průměr zátěže. Tento démon by pak mohl spouštět skripty/programy z určitého adresáře a podle potřeby je spouštět/pokračovat nebo zastavovat (pomocí signálů).