更好的是:如果计算机处于空闲状态,我怎样才能完全暂停一个要求苛刻的进程?

更好的是:如果计算机处于空闲状态,我怎样才能完全暂停一个要求苛刻的进程?

我的电脑上有些后台任务需要大量处理。以最高优先级运行这些任务仍然会导致交互速度缓慢,这让我很烦恼。

有没有比最大化友善更好的方法?

我希望一使用电脑,后台任务就停止。如果我五分钟左右不使用电脑,后台任务就会继续。

后台工作没有截止期限。即使花费更长时间也没关系。

我想减慢的工作是视频编码过程,它每个 CPU 使用一个线程。在我的笔记本电脑上有 4 个线程,负载为 400%。

答案1

在使用计算机时管理(暂停)繁重流程的另一种方法

我结合测试了下面的脚本kdenlive,渲染了一个大视频。在测试中,它运行良好。(后台)脚本本身几乎不消耗任何资源。它唯一要做的就是每 5 秒检查一次目标进程是否运行。只有这样,它才会检查当前的空闲时间。两者都意味着没有什么到您的系统

该脚本基于 的使用xprintidlexprintidle跟踪键盘和鼠标事件并测量无活动的时间。如果要求高的过程开始,则立即暂停(因为计算机显然正在使用),命令如下:

kill -STOP <pid>

如果随后空闲时间超过某个(任意)时间限制,则使用以下命令恢复该过程:

kill -CONT <pid>

随后,如果空闲时间回到设定的时间限制以下,则该过程再次暂停,依此类推。

在此处输入图片描述

空闲时间之前/期间/之后的 CPU 使用情况,使用 melt 通过 kdenlive 渲染大型视频

关于 kill -STOP 和 kill -CONT

虽然在中提到了参数-STOP和,但奇怪的是,并没有解释。然而,例如-CONTman 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>您希望进程启动之前的空闲时间(以秒为单位)是多少。
    启动消耗进程剧本开始了。

  • 如果一切正常,请将脚本添加到启动应用程序:Dash > 启动应用程序> 添加命令:

     python3 /path/to/manage_proc.py <seconds> <process_name>
    

相关内容