Wie führe ich einen Befehl nach einer bestimmten Zeit der Inaktivität aus, ausgelöst durch Tastatur- und Mausaktivität und ein Vollbildfenster?

Wie führe ich einen Befehl nach einer bestimmten Zeit der Inaktivität aus, ausgelöst durch Tastatur- und Mausaktivität und ein Vollbildfenster?

Mein Rechner hängt sich nach 5 Minuten Inaktivität auf, ich möchte jedoch auch nach 4 Minuten und 30 Sekunden Inaktivität einen Befehl ausführen. Gibt es eine Möglichkeit, einen Befehl nach 4 Minuten und 30 Sekunden Inaktivität auszuführen?NEINVollbildfenster und keine Tastatur- und Mausaktivität?

Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18. Ich habe mir bereits angesehendiese Frage. Wird jedoch xprintidlenicht durch ein Vollbildfenster ausgelöst, sondern nur durch Tastatur- und Mausaktivität.

Antwort1

Ausführen eines Befehls nach einer Leerlaufzeit, ausgelöst durch den VollbildmodusUndMaus-/Tastaturaktivität

Hallo Paranoid Panda, das folgende Skript sollte das tun, was Sie beschreiben.

Das Problem war, dass sowohl ein (beliebiges) Fenster im Vollbildmodus als auch Maus- oder Tastaturaktivitäten die „echte“ Leerlaufzeit zurücksetzen sollten. Da dies xprintidlenicht über die Befehlszeile zurückgesetzt werden kann, habe ich es gelöst, indem ich bei einem Vollbildfenster die Leerlaufzeit von sich selbst abgezogen habe:

  • In einer Schleife sucht das Skript die aktuelle Leerlaufzeit
  • wenn ein beliebiges Fenster maximiert ist (überprüfen, ob ein Fenster so groß wie die Bildschirmauflösung ist, indem sowohl xrandrals auch verwendet werden wmctrl -lG),aktuellDie Leerlaufzeit wird von der Leerlaufzeit abgezogen, wodurch eine korrekte „echte“ Leerlaufzeit entsteht, auch wenn das Fenster nicht mehr im Vollbildmodus angezeigt wird.

Das Drehbuch

#!/usr/bin/env python3
import subprocess
import time
import sys

idletime = int(sys.argv[1])
command = sys.argv[2]

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()

def get_res():
    xr = [s for s in get(["xrandr"]).split() \
          if "+0+0" in s][0].split("x"); xr[1] = xr[1].split("+")[0]
    return xr

res = get_res()

def check():
    front = [l for l in get(["xprop", "-root"]).splitlines() \
             if "_NET_ACTIVE_WINDOW(WINDOW):" in l][0].split("#")[-1].strip()
    front = front[:2]+(10-len(front))*"0"+front[2:]
    try:
        wdata = subprocess.check_output(
            ["wmctrl", "-lG"]
            ).decode("utf-8").splitlines()
        match = [l for l in wdata if front in l][0].split()[4:6]
        if match == res:
            return True
        else:
            return False
    except subprocess.CalledProcessError:
        pass

minus = 0; real_idle = 0; t1 = 0; due_1 = False
while True:
    time.sleep(1)
    fscreen = check()
    t2 = int(int(get(["xprintidle"]))/1000)
    if t2 < t1:
        minus = 0; real_idle = 0
    else:
        if fscreen == True:
            minus = t2
    real_idle = t2 - minus
    due_2 = [real_idle > idletime][0]
    if all([real_idle > idletime, due_1 != due_2]):
        subprocess.Popen(["/bin/bash", "-c", command])
    due_1 = due_2
    t1 = t2

Benutzen

  • das Skript benötigt wmctrlund xprintidle:

    sudo apt-get install xdotool xprintidle
    
  • Kopieren Sie das Skript in eine leere Datei und speichern Sie es unterrun_ontime.py

  • Führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/run_ontime.py <seconds> <command>
    

    wobei der Befehl in Anführungszeichen stehen muss, wenn er Leerzeichen enthält. Getestet habe ich es beispielsweise mit:

    python3 /path/to/run_ontime.py 10 "firefox askubuntu.com"
    

    das hat funktioniert :)

Notiz

Der Befehl wird jedes Mal einmal ausgeführt, wenn die Leerlaufzeit überschritten wird.

verwandte Informationen