Некоторые фоновые задания на моем ПК делают тяжелую обработку. Выполнение их с максимальным хорошим уровнем все еще производит медленную интерактивность и раздражает меня.
Существует ли лучший путь, чем хороший максимум?
Как только я использую ПК, я хочу, чтобы фоновое задание остановилось. Это может продолжиться, если я не использую ПК в течение приблизительно пяти минут.
Фоновое задание не имеет никакой мертвой строки. Если не имеет значения, если это берет намного дольше.
Задание, которое я хочу замедлить, является процессом кодирования видео, который использует один поток на ЦП. На моем ноутбуке существует 4 потока, производящие 400%-ю загрузку.
Я протестировал сценарий ниже в сочетании с kdenlive
, рендеринг большого видео. В тестах это хорошо работало. (Фон) сам сценарий не использует практически ресурсов. Единственная вещь, которую это в основном делает, проверить однажды в 5 секунд, если целенаправленный процесс работает. Только если так, это проверит текущее время простоя. Оба ничего не значат для Вашей системы
Сценарий основан на использовании xprintidle
. xprintidle
отслеживает и клавиатуру - и события от нажатия мыши и измеряет время не было никакого действия. Если требовательный процесс запускается, он сразу приостанавливается (так как компьютер, очевидно, используется) с командой:
kill -STOP <pid>
Если, впоследствии, время простоя превышает определенное (произвольное) ограничение по времени, процесс возобновляется, с помощью команды:
kill -CONT <pid>
Впоследствии, если время простоя возвращается к ниже ограничения по времени набора, процесс приостанавливается снова и так далее.
использование CPU в течение времени простоя, представляя большое видео с kdenlive, использующим плавку
Хотя аргументы -STOP
и -CONT
упоминаются в man kill
, это не объяснено, странно. Однако, например, здесь мы можем считать то, что это делает:
В основном kill -STOP 1234
приостановит процесс с pid 1234
, и kill -CONT 1234
возобновит его. Это - как будто можно спать отдельные приложения вместо всего компьютера.
Таким образом требовательный процесс помещается в сон, в то время как компьютер используется (не-неактивный).
Сценарий работает с именем процесса (требуется быть приостановленными при использовании компьютера) как аргумент.
Прием должен найти, что корректный процесс приостанавливается. Это не будет имя Вашего видео редактора, так как это будет, конечно, использовать внешние инструменты для рендеринга. В моем случае, kdenlive
б/У melt
. Сценарий успешно приостанавливается melt
и возобновленный рендеринг после определенного времени простоя.
Можно использовать top
управляйте, не уверены ли Вы в имени процесса. Выполненный top
в терминале и нажимают Ctrl+M к виду на использовании памяти. Требовательный процесс будет в вершине.
#!/usr/bin/env python3
import subprocess
import time
import sys
limit = int(sys.argv[1])
proc = sys.argv[2]
def get(command):
return subprocess.check_output(command).decode("utf-8").strip()
def check_runs(proc):
try:
return get(["pgrep", proc])
except subprocess.CalledProcessError:
pass
pid1 = check_runs(proc)
t1 = int(int(get("xprintidle"))/1000)
while True:
time.sleep(5)
pid2 = check_runs(proc)
# (only) if the process exists, manage its activity
if pid2 != None:
t2 = int(int(get("xprintidle"))/1000)
# if the process just started, obviously the system is not idle ->
# pause the process (try in case it was killed by user in between):
if pid1 == None:
try:
subprocess.Popen(["kill", "-STOP", pid2])
except subprocess.CalledProcessError:
pass
# If there is a change in time status (breaktime entered or ended)
else:
if [t2 > limit, t1 > limit].count(True) == 1:
if t2 > limit:
cmd = ["kill", "-CONT", pid2]
else:
cmd = ["kill", "-STOP", pid2]
subprocess.Popen(cmd)
t1 = t2
pid1 = pid2
Потребности сценария xprintidle
sudo apt-get instal xprintidle
Скопируйте сценарий выше в пустой файл, сохраните его как manage_proc.py
Тестовый прогон это командой
python3 /path/to/manage_proc.py <seconds> <process_name>
где <seconds>
время простоя в секундах, прежде чем Вы хотели бы, чтобы Ваш процесс запустился.
Запустите потребляющий процесс после запущенного сценария.
Если все хорошо работает, добавьте сценарий для Запущения Приложений: Тире> Приложения Запуска> Добавляет команду:
python3 /path/to/manage_proc.py <seconds> <process_name>