Лучше приятно: как я могу полностью приостановить требовательный процесс, если компьютер выключен?

Некоторые фоновые задания на моем ПК выполняют тяжелую обработку. Запуск их с максимальным хорошим уровнем все еще вызывает медленную интерактивность и раздражает меня.

Есть ли лучший способ, чем максимально хороший?

Как только я использую ПК, я хочу остановить фоновую работу. Это может продолжаться, если я не использую компьютер в течение пяти минут.

Фоновое задание не имеет мертвой линии. Если это не имеет значения, если это займет гораздо больше времени.

Работа, которую я хочу замедлить, - это процесс кодирования видео, который использует один поток на процессор. На моем ноутбуке 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>
    
Другие вопросы по тегам