
Mi máquina se suspende después de 5 minutos de inactividad, sin embargo, también quiero ejecutar un comando después de 4 minutos y 30 segundos de inactividad. ¿Hay alguna manera de ejecutar un comando después de 4 minutos y 30 segundos deNo¿Ventana de pantalla completa y sin actividad de teclado y mouse?
Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18. ya he miradoesta pregunta. Sin embargo, xprintidle
no se activa con una ventana de pantalla completa, sólo con la actividad del teclado y el mouse.
Respuesta1
Ejecutar un comando después del tiempo de inactividad, activado por ambas pantallas completasyactividad del mouse/teclado
Hola Paranoid Panda, el siguiente script debería funcionar como lo describe.
El problema era que tanto tener una ventana (cualquiera) en pantalla completa, como también las actividades del mouse o del teclado deberían restablecer el tiempo de inactividad "real". Como xprintidle
no se puede restablecer desde la línea de comando, lo resolví restándole el tiempo de inactividad con motivo de una ventana de pantalla completa:
- En un bucle, los scripts buscan el tiempo de inactividad actual.
- Si alguna ventana está maximizada (verificando si alguna ventana es tan grande como la resolución de la pantalla, usando ambos
xrandr
ywmctrl -lG
), elactualEl tiempo de inactividad se resta del tiempo de inactividad, lo que da como resultado un tiempo de inactividad "real" correcto, incluso cuando la ventana ya no está en pantalla completa.
La secuencia de comandos
#!/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
Usar
el guión necesita
wmctrl
yxprintidle
:sudo apt-get install xdotool xprintidle
Copie el script en un archivo vacío, guárdelo como
run_ontime.py
Ejecútelo con el comando:
python3 /path/to/run_ontime.py <seconds> <command>
donde el comando debe estar entre comillas si contiene espacios. Lo probé por ejemplo con:
python3 /path/to/run_ontime.py 10 "firefox askubuntu.com"
que hizo el trabajo :)
Nota
El comando se ejecuta una vez cada vez que pasa el tiempo de inactividad.