【问题标题】:Keep looping until ram is full then pause and continue the loop once it get free again继续循环直到 ram 已满,然后暂停并在它再次空闲后继续循环
【发布时间】:2017-08-19 19:54:48
【问题描述】:

我必须在许多文件上运行一个命令,我通过 bash 循环和每个命令末尾的 & 符号来执行,以便文件并行运行。但是,如果我有 100 个或这样的文件,我不想消耗服务器上的所有内存。有没有办法让循环继续进行,直到 ram 使用量超过某个阈值,此时循环暂停,一旦 ram 再次空闲,然后继续循环到下一个文件?谢谢

【问题讨论】:

    标签: bash loops for-loop while-loop sh


    【解决方案1】:

    是的,你可以。使用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 以跳过这样的函数 while $used > $threshold; do sleep 5 used="$(free -b | awk 'NR == 2 {print $2}')" 完成
    • 你必须把算术表达式和检查放在双括号中:while (( $used > $threshold ))
    • 在我的系统上,“free -b”第二行的第二个字段是ram的总量。显然,安装的 ram 永远不会改变。但内存的空闲量也不是一个好的指标,因为内核往往会用完大部分可用的内存。 free+buffers 或许值得一看。
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多