Tim*_*Tim 6 bash cpu shell-script limit cpu-usage
我有一个运行其他 CPU 密集型命令的 bash 脚本。
当我申请cpulimitbash 脚本时,top脚本内命令的显示进程的输出仍然不受限制地运行cpulimit。我想知道如何限制 bash 脚本中命令的 CPU 使用率?
也许,你不能。
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它的力量和对过程的统治。在这里您也可以遇到优先级类别,idle,real-time,fifo,batch,等等...并且优先级范围非常大,从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)