Ma machine s'interrompt après 5 minutes d'inactivité, mais je souhaite également exécuter une commande après 4 minutes et 30 secondes d'inactivité. Existe-t-il un moyen d'exécuter une commande après 4 minutes et 30 secondes de aucune fenêtre plein écran et aucune activité clavier et souris?
J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18. J'ai déjà regardé cette question . Cependant, xprintidle
n'est pas déclenché par une fenêtre plein écran, uniquement par l'activité du clavier et de la souris.
Salut Paranoid Panda, le script ci-dessous devrait faire ce que vous décrivez.
Le problème était que les deux ayant une (toute) fenêtre plein écran, ainsi que des activités de souris ou de clavier devraient réinitialiser le temps d'inactivité "réel". Comme xprintidle
ne peut pas être réinitialisé à partir de la ligne de commande, je l'ai résolu en soustrayant le temps d'inactivité de lui-même à l'occasion d'une fenêtre plein écran:
xrandr
et wmctrl -lG
), le courant temps d'inactivité est soustrait du temps d'inactivité, résultant en un temps d'inactivité "réel" correct, même lorsque la fenêtre n'est plus en plein écran.#!/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
le script a besoin de wmctrl
et xprintidle
:
Sudo apt-get install xdotool xprintidle
Copiez le script dans un fichier vide, enregistrez-le sous run_ontime.py
Exécutez-le par la commande:
python3 /path/to/run_ontime.py <seconds> <command>
où la commande doit être entre guillemets si elle contient des espaces. Je l'ai testé par exemple avec:
python3 /path/to/run_ontime.py 10 "firefox askubuntu.com"
qui a fait le boulot :)
La commande est exécutée une fois à chaque fois que le temps passe au repos.