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

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

Существует ли лучший путь, чем хороший максимум?

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

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

Задание, которое я хочу замедлить, является процессом кодирования видео, который использует один поток на ЦП. На моем ноутбуке существует 4 потока, производящие 400%-ю загрузку.

3
задан 4 January 2016 в 23:43

1 ответ

Альтернативный способ справиться (пауза) с требовательным процессом, в то время как компьютер используется

Я протестировал сценарий ниже в сочетании с kdenlive, рендеринг большого видео. В тестах это хорошо работало. (Фон) сам сценарий не использует практически ресурсов. Единственная вещь, которую это в основном делает, проверить однажды в 5 секунд, если целенаправленный процесс работает. Только если так, это проверит текущее время простоя. Оба ничего не значат для Вашей системы

Сценарий основан на использовании xprintidle. xprintidle отслеживает и клавиатуру - и события от нажатия мыши и измеряет время не было никакого действия. Если требовательный процесс запускается, он сразу приостанавливается (так как компьютер, очевидно, используется) с командой:

kill -STOP <pid>

Если, впоследствии, время простоя превышает определенное (произвольное) ограничение по времени, процесс возобновляется, с помощью команды:

kill -CONT <pid>

Впоследствии, если время простоя возвращается к ниже ограничения по времени набора, процесс приостанавливается снова и так далее.

enter image description here

использование 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>
    
8
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: