You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写脚本:监控磁盘至60%或超时5分钟后终止命令

完整实现脚本及问题修正

先给你修正后的完整脚本,再逐条说明原代码里的问题:

#!/bin/bash

# 启动持续占用磁盘的后台命令,记录PID
dd if=/dev/zero of=/tmp/fill_disk bs=1M count=0 oflag=append conv=notrunc &
FILL_PID=$!

# 初始化计数器(每次sleep30秒,5分钟=10次)
count=0

while true; do
    # 每次循环重新获取/tmp的磁盘使用率(注意:df输出中使用率是第5列)
    USED_SPACE=$(df /tmp | tail -n +2 | awk '{print $5}' | sed 's/%//g')
    
    # 判断是否达到60%使用率
    if [ "$USED_SPACE" -ge 60 ]; then
        echo "/tmp使用率已达60%,停止占盘命令"
        kill $FILL_PID
        rm -f /tmp/fill_disk  # 可选:清理生成的临时文件
        break
    fi
    
    # 判断是否超过5分钟(每次sleep30秒,10次就是300秒=5分钟)
    if [ "$count" -ge 10 ]; then
        echo "运行时长已超5分钟,停止占盘命令"
        kill $FILL_PID
        rm -f /tmp/fill_disk  # 可选:清理生成的临时文件
        break
    fi
    
    # 等待30秒后再次检查
    sleep 30
    ((count++))
done

原代码的核心问题修正:

  • 磁盘使用率提取错误:你原代码用awk '{print $4}',但从你给出的df输出看,使用率是第5列(最后一列的1%),所以要改成awk '{print $5}',否则拿到的是剩余空间数值,不是使用率。
  • 变量引用错误:原代码while [ #{USED_SPACE} -lt 60 ]的写法错误,正确变量引用是$USED_SPACE,而且需要每次循环重新获取使用率,不然变量会一直停留在初始值,无法检测到磁盘空间变化。
  • 时间判断逻辑错误:你用i做计数,但i是整数,不能和"5m"比较。5分钟=300秒,每次sleep30秒,所以计数到10次就达到5分钟,直接判断count -ge 10即可,同时原代码的if [[ $i > "5m" ]]; do语法错误,do要改成then。
  • 后台进程管理:启动占盘命令时必须加&放到后台,同时记录它的PID($!表示最近后台进程的PID),这样后续才能用kill命令终止它。
  • 循环条件优化:用while true更灵活,在循环内部通过两个if判断终止条件,比原代码的单一循环条件更清晰。

额外说明:

  • 占盘命令用dd if=/dev/zero of=/tmp/fill_disk bs=1M count=0 oflag=append conv=notrunc,这个命令会持续以1MB的块大小往文件里写零,不会自动停止,适合用来测试磁盘占用。
  • 脚本最后可以选择删除生成的/tmp/fill_disk临时文件,避免占用空间,如果需要保留测试文件可以去掉rm命令。

内容的提问来源于stack exchange,提问作者Noway_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:27:22