如何编写脚本:监控磁盘至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_
相关产品推荐
相关产品推荐

