磁盘清理脚本终端运行正常但crontab定时执行不清理问题求助
磁盘清理脚本crontab定时执行失效排查方案
- 环境变量缺失问题
crontab运行时不会加载用户shell的环境变量配置(如.bashrc、.profile等),你的脚本中用到的$SCRIPT_SUM、$SCRIPT_LOG属于自定义变量,若未在脚本内部显式赋值,crontab执行时会识别为空值。
解决方案:在脚本开头添加变量的绝对路径定义,示例:
SCRIPT_SUM="/tmp/disk_usage.tmp" SCRIPT_LOG="/var/log/disk_clean.log"
- 文件路径匹配错误
你的脚本中df命令输出写入的是$SCRIPT_SUM,但后续grep读取的是固定文件名SCRIPT_SUM.txt,二者若不匹配会导致无法读取到磁盘使用率数据。同时crontab默认工作目录为执行用户的家目录,相对路径会找不到目标文件。
解决方案:所有文件路径统一使用绝对路径,避免硬编码文件名和相对路径。 - 命令路径不兼容
crontab的PATH环境变量配置极简,可能无法识别df、awk、grep、rm等命令的相对路径。
解决方案:命令统一使用绝对路径,可通过which 命令名查询对应绝对路径,示例:
# 替换df、awk等命令为绝对路径 /usr/bin/df -hT /data* > "$SCRIPT_SUM" disk_space=$(/usr/bin/grep 'data1' "$SCRIPT_SUM" | /usr/bin/awk '{print $6}' | /usr/bin/sed 's/%//')
- 使用率提取逻辑脆弱
你使用-F " "两个空格作为分隔符提取使用率的逻辑容错性极低,不同系统的df -hT输出列对齐方式存在差异,很容易提取到错误字段。
解决方案:改用POSIX标准输出的df -P参数获取稳定格式的数据,简化提取逻辑:
# 直接提取/data1分区的使用率,无需写入临时文件 disk_space=$(/usr/bin/df -P /data1 | /usr/bin/awk 'NR==2{print $5}' | /usr/bin/sed 's/%//')
- 权限校验
确认crontab配置的执行用户,对脚本本身、/data1等目标目录、日志写入路径均有对应读写执行权限。 - 添加调试日志
修改crontab规则将运行输出重定向到日志,可直接定位错误原因:
*/10 * * * * /D1/D2/D3/D4/D5/clean.sh >> /tmp/clean_debug.log 2>&1
查看/tmp/clean_debug.log即可看到脚本运行时报的具体错误。
内容的提问来源于stack exchange,提问作者Rafsan Sadman
相关产品推荐
相关产品推荐

