磁盘告警Bash脚本定时压缩任务失效求助(Crontab配置问题)
磁盘告警脚本Crontab无效果的排查与修复
核心定时规则错误先修正
你当前的Crontab规则5 * * * *是每小时第5分钟执行一次,并非每5分钟执行一次。要实现每5分钟执行的需求,正确的规则应为:
*/5 * * * * /home/irkhamdayat/coba-bash/warning-disk.sh tes3 coba-warning
注:先给脚本添加执行权限
chmod +x /home/irkhamdayat/coba-bash/warning-disk.sh,之后就无需用sh前缀调用,直接写脚本路径即可。
1. 环境变量缺失问题
Crontab执行时的PATH环境变量比用户登录shell窄很多,可能找不到zip命令。解决步骤:
- 在终端执行
which zip,获取zip的绝对路径(比如/usr/bin/zip) - 将脚本里的
zip替换为这个绝对路径,避免因命令找不到导致执行失败
2. 工作目录不匹配问题
Crontab默认在用户主目录(/home/irkhamdayat)执行脚本,但你的日志文件大概率在脚本所在目录(/home/irkhamdayat/coba-bash)。需要在脚本开头切换到脚本所在目录:
#!/bin/sh # 切换到脚本所在目录,切换失败则退出 cd "$(dirname "$0")" || exit 1
这样. -i '*.log'才能正确找到目标日志文件。
3. 脚本参数与压缩逻辑错误
原脚本的zip命令语法混乱,且未检查目标目录是否存在:
- 原命令
zip -r $1 $2 . -i '*.log'会错误地将$2(coba-warning)目录和当前目录日志一起压缩到$1.zip - 若
coba-warning目录不存在,后续mv命令会直接失败
修正后的压缩逻辑:
# 确保目标目录存在,不存在则创建 mkdir -p "$2" # 仅压缩当前目录下的.log文件到指定压缩包 /usr/bin/zip -r "${1}.zip" . -i '*.log' # 移动压缩包到目标目录 mv "${1}.zip" "$2/"
4. 脚本逻辑冗余问题
原脚本会遍历每个磁盘分区,只要有一个分区使用率低于60%就执行一次压缩,可能导致重复执行(比如多个分区都低于阈值时,会多次压缩覆盖文件)。建议把压缩逻辑移到循环外,通过标记控制只执行一次:
#!/bin/sh cd "$(dirname "$0")" || exit 1 # 初始化压缩标记 compress_needed=0 df -Ph | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5,$1 }' | while read output; do echo "$output" used=$(echo "$output" | awk '{print $1}' | sed s/%//g) partition=$(echo "$output" | awk '{print $2}') if [ "$used" -ge 60 ]; then echo "The partition \"$partition\" on $(hostname) has used $used% at $(date)" else echo "Disk space usage is under threshold for \"$partition\" on $(hostname) at $(date)" compress_needed=1 fi done # 仅当有分区满足条件时执行一次压缩 if [ "$compress_needed" -eq 1 ]; then mkdir -p "$2" /usr/bin/zip -r "${1}.zip" . -i '*.log' mv "${1}.zip" "$2/" fi
5. 查看Crontab执行日志
通过系统日志可以直接定位执行错误:
- CentOS/RHEL系统:查看
/var/log/cron - Debian/Ubuntu系统:过滤cron相关日志
grep CRON /var/log/syslog
内容的提问来源于stack exchange,提问作者Irkham 11
相关产品推荐
相关产品推荐

