GNU/Linux >> Znalost Linux >  >> Linux

Spusťte příkaz, když je systém nečinný a když je znovu aktivní

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ů).


Linux
  1. Použití příkazu timedatectl ke změně času a data v systému RHEL7 Linux

  2. 10 úžasných a záhadných použití (!) symbolu nebo operátoru v příkazech Linuxu

  3. Jak spustit příkaz, když se aktualizuje obsah adresáře?

  1. Jak spustit příkaz jako správce systému (root)?

  2. Ssh na více hostitelů a spustit příkaz?

  3. Jak napsat a spustit svůj první Qt program v Debianu 10

  1. Co se stane, když spustím příkaz Cat /proc/cpuinfo?

  2. 7 Linux Date Příklady příkazů pro zobrazení a nastavení systémového data a času

  3. Plánování v Linuxu:spusťte úlohu, když je počítač nečinný (=žádný vstup uživatele)