
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 xprintidle
nicht 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 xprintidle
nicht ü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
xrandr
als auch verwendet werdenwmctrl -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
wmctrl
undxprintidle
:sudo apt-get install xdotool xprintidle
Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
run_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.