【发布时间】:2017-08-19 19:54:48
【问题描述】:
我必须在许多文件上运行一个命令,我通过 bash 循环和每个命令末尾的 & 符号来执行,以便文件并行运行。但是,如果我有 100 个或这样的文件,我不想消耗服务器上的所有内存。有没有办法让循环继续进行,直到 ram 使用量超过某个阈值,此时循环暂停,一旦 ram 再次空闲,然后继续循环到下一个文件?谢谢
【问题讨论】:
标签: bash loops for-loop while-loop sh
我必须在许多文件上运行一个命令,我通过 bash 循环和每个命令末尾的 & 符号来执行,以便文件并行运行。但是,如果我有 100 个或这样的文件,我不想消耗服务器上的所有内存。有没有办法让循环继续进行,直到 ram 使用量超过某个阈值,此时循环暂停,一旦 ram 再次空闲,然后继续循环到下一个文件?谢谢
【问题讨论】:
标签: bash loops for-loop while-loop sh
是的,你可以。使用free 命令确定 RAM 使用情况。然后将当前使用情况与您的阈值进行比较。将循环的条件包装成一个函数,使其更具可读性:
ramAboveThreshold() {
local threshold=6000000000 # threshold in bytes (6 GB)
local used="$(free -b | awk 'NR == 2 {print $2}')"
(( used > threshold ))
}
在您的旧循环中,放置另一个循环,等待 RAM 使用量降至您的阈值以下:
for i in myFiles/*; do
while ramAboveThreshold; do
sleep 5
done
myCommand "$i" &
done
free 不仅打印已用 RAM,还打印可用 RAM 和总 RAM,因此可以将脚本更改为具有类似 »至少 n 个字节空闲«甚至 » 的阈值使用不到 60%«.
【讨论】:
while (( $used > $threshold ))。