Лучше приятно: как я могу полностью приостановить требовательный процесс, если компьютер выключен?
Некоторые фоновые задания на моем ПК выполняют тяжелую обработку. Запуск их с максимальным хорошим уровнем все еще вызывает медленную интерактивность и раздражает меня.
Есть ли лучший способ, чем максимально хороший?
Как только я использую ПК, я хочу остановить фоновую работу. Это может продолжаться, если я не использую компьютер в течение пяти минут.
Фоновое задание не имеет мертвой линии. Если это не имеет значения, если это займет гораздо больше времени.
Работа, которую я хочу замедлить, - это процесс кодирования видео, который использует один поток на процессор. На моем ноутбуке 4 потока, производящих 400% нагрузки.
1 ответ
Альтернативный способ управлять (приостановить) требовательным процессом, пока компьютер используется
Я проверил сценарий ниже в сочетании с kdenlive
рендеринг большого видео. В тестах все работало нормально. Сам (фоновый) скрипт практически не потребляет ресурсов. Единственное, что он делает, - это проверяет один раз в 5 секунд, запускается ли целевой процесс. Только если это так, он проверит текущий простой. Оба ничего не значат для вашей системы
Сценарий основан на использовании xprintidle
, xprintidle
отслеживает события, связанные с клавиатурой и мышью, и измеряет время отсутствия активности. Если запускается требовательный процесс, он немедленно приостанавливается (поскольку компьютер, очевидно, используется) с помощью команды:
kill -STOP <pid>
Если впоследствии время простоя превышает определенный (произвольный) срок, процесс возобновляется с помощью команды:
kill -CONT <pid>
Впоследствии, если время простоя возвращается ниже установленного предела времени, процесс снова приостанавливается и так далее.
использование процессора до / во время / после простоя, рендеринг большого видео с помощью kdenlive с использованием melt
О убить -STOP и убить -CONT
Хотя аргументы -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>
это время простоя в секундах, прежде чем вы захотите запустить процесс.
Запустите процесс потребления после запуска сценария.Если все работает нормально, добавьте скрипт в Startup Applications: Dash > Startup Applications > Add the command:
python3 /path/to/manage_proc.py <seconds> <process_name>