Как выполнить команду после определенного периода бездействия, вызванного активностью клавиатуры и мыши и полноэкранным окном?
Моя машина приостанавливается после 5 минут бездействия, однако я хочу выполнить команду также после 4 минут и 30 секунд бездействия. Есть ли способ выполнить команду через 4 минуты 30 секунд без полноэкранного окна и без действий клавиатуры и мыши?
Я использую Ubuntu GNOME 15.10 с GNOME 3.18. Я уже посмотрел на этот вопрос. Тем не мение, xprintidle
не вызывается полноэкранным окном, только активностью клавиатуры и мыши.
1 ответ
Выполнение команды после простоя, вызванное как работой в полноэкранном режиме, так и мышью / клавиатурой
Привет, Параноидальная Панда, приведенный ниже скрипт должен делать то, что ты описал.
Проблема заключалась в том, что как при наличии (любого) окна в полноэкранном режиме, так и при работе с мышью или клавиатурой должны сбрасываться "реальные" простои. поскольку xprintidle
не может быть сброшен из командной строки, я решил это, вычитая время простоя из себя в случае полноэкранного окна:
- В цикле сценарии ищут текущее время простоя
- если какое-либо окно развернуто (проверка того, является ли какое-либо окно размером с разрешение экрана, используя оба
xrandr
а такжеwmctrl -lG
), текущее время простоя вычитается из времени простоя, что приводит к правильному "реальному" времени простоя, даже когда окно больше не является полноэкранным.
Сценарий
#!/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
Использовать
сценарий нуждается
wmctrl
а такжеxprintidle
:sudo apt-get install xdotool xprintidle
Скопируйте скрипт в пустой файл, сохраните его как
run_ontime.py
Запустите его командой:
python3 /path/to/run_ontime.py <seconds> <command>
где команда должна быть в кавычках, если она содержит пробелы. Я проверил это, например, с:
python3 /path/to/run_ontime.py 10 "firefox Ask-ubuntu.ru"
который сделал работу:)
Заметка
Команда выполняется один раз каждый раз, когда время простаивает.