运行其他命令的 bash 脚本上的 cpulimit

Tim*_*Tim 6 bash cpu shell-script limit cpu-usage

我有一个运行其他 CPU 密集型命令的 bash 脚本。

当我申请cpulimitbash 脚本时,top脚本内命令的显示进程的输出仍然不受限制地运行cpulimit。我想知道如何限制 bash 脚本中命令的 CPU 使用率?

sat*_*oto 1

也许,你不能。

cpulimit逻辑很简单,它需要进程的 pid 并简单地发送其信号kill -STOP $PID,然后kill -CONT $PID,再一次,再一次,再一次,再一次......

并测量 cpu 使用率来计算 STOP 和 CONT 之间的延迟。

在您的情况下,pstree复杂的 bash 脚本将占用控制台的 N*x 屏幕。

我可以向您建议另一种方法来降低任何 bash 脚本甚至二进制可执行文件的 cpu 使用率。

1) nice- 其获取过程并将其优先级从-20(最高优先级)增加或减少到20(最低优先级)。可能是音调太低,这就是为什么,出现了另外两个 utils 和内核钩子:

2) ionice- 可能是第二代nice. 您可以按优先级从 0(最低优先级)到 7(最高优先级)分隔进程。另外,您可以按类别、实时(最高)、best-efforts(中间)、空闲(最低)和无(默认)来分隔进程。

3) chrt- 我所见过的最高的事物,它类似于cpulimit它的力量和对过程的统治。在这里您也可以遇到优先级类别,idlereal-timefifobatch,等等...并且优先级范围非常大,从1到99。

例如,您可以启动一个巨大的进程chrt -r -p 99 process- 它会耗尽您的所有资源。

同样,任何大型守护进程都可以在“后台”进行软运行chrt -r -p 0 process- 当系统资源繁忙时,它将等待其他进程。

不管怎样,我强烈建议你在开始之前阅读man chrt一下。man ionice

例如,我用于rtorrentp2p。它是我的系统的最低优先级任务,然后我以这样的方式启动它:

nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Run Code Online (Sandbox Code Playgroud)

或者,您可以采取 hooks&haks 方式。并编写您自己的 cpulimit_wrapper 脚本。例如:

# cat bash_script.sh 
#!/bin/bash


while sleep 0; do
        find /

        dd if=/dev/random of=/tmp/random.bin bs=1M count=1000
done
Run Code Online (Sandbox Code Playgroud)

# cat cpulimit.sh 
#!/bin/bash


TARGET=$1

[ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1

cpulimit -l 1 bash $TARGET

while sleep 0;do
        lsof -n -t $TARGET | xargs pstree -p | sed -e 's/(/(\n/g' | sed -e 's/)/\n)/g' | egrep -v '\(|\)' | while read i; do 
                echo $i; 
                cpulimit -l 1 -b -p $i; 
        done
done
Run Code Online (Sandbox Code Playgroud)