定时任务误删风险源于脚本内容、权限和环境变量失控,而非cron本身;需校验变量路径、用find替代rm -rf、加白名单、引入回收站机制、最小化执行权限、启用审计与快照回滚。
定时任务本身不会误删,但脚本内容、执行权限和环境变量一旦失控,就可能把“自动清理”变成“自动毁灭”。关键不在 cron 本身,而在脚本怎么写、谁来跑、删什么、删之前有没有留退路。
很多误删源于脚本里带变量的 rm -rf 操作,比如 rm -rf $LOG_DIR/*。一旦 $LOG_DIR 为空或被覆盖,就会变成 rm -rf /* 或 rm -rf ./*。
test -d "$LOG_DIR" 判断目录是否存在且非空find "$LOG_DIR" -maxdepth 1 -type f -name "*.log" -delete 这类更可控的方式/data、/backup)加白名单检查,不匹配则 exit 1 并记录告警哪怕定时任务执行的是“清理”,也别真删——先挪走,再择机清空。
/var/log/.trash/nginx/,避免混用mv "$file" "/var/log/.trash/nginx/$(basename "$file").$(date +%s)" 替代 rm让定时任务以最低必要权限运行,是防误删的底层防线。
logclean)setfacl 或目录 umask 进一步限制0 2 * * * logclean /opt/scripts/clean-nginx-logs.sh
防不住万一,就得确保能秒级定位+还原。
/etc、/var/www)开启 inotify 监控,发现异常批量删除立即告警并暂停后续任务