权限或安全策略限制
可能场景:
### 目录权限冲突:
你的目录权限为 drwxr-xr-x(属主 mssql),但 cron 任务以 root 执行。
风险点:若目录内文件属主为 mssql 且权限为 700,root 删除时可能触发 SELinux/AppArmor 拦截。
解决方案:
# 检查安全日志
grep 'avc.*denied' /var/log/audit/audit.log # SELinux
grep 'DENIED' /var/log/syslog # AppArmor
一、权限问题(核心矛盾)
- 目录所有权与执行用户不匹配
drwxr-xr-x 11 mssql mssql 285 4月 17 00:00 /data/backup/file/mssql/
现象:目录属于 mssql 用户,但 crontab 任务以 root 用户执行。
风险:虽然 root 用户有权限操作其他用户的文件,但以下情况可能导致失败:
子目录权限限制:若目录内文件/子目录权限为 700(仅 mssql 用户可写),root 的 rm -rf 可能无法删除。
SELinux/AppArmor 限制:安全模块可能阻止跨用户文件操作(检查 /var/log/audit/audit.log)。
2、解决方案
# 方案1:修改目录归属权(需确认无业务影响)
chown -R root:root /data/backup/file/mssql/# 方案2:以 mssql 用户执行任务(推荐)
crontab -u mssql -e # 添加任务到 mssql 用户的 crontab
二、日志为空的原因排查
- 命令静默执行
可能性:find 未匹配到任何文件(-mtime +7 条件不满足),导致无输出。
验证方法:
# 手动测试匹配条件
find /data/backup/file/mssql/ -mindepth 1 -maxdepth 1 -mtime +7 -ls
- 输出被重定向到系统日志
可能性:部分系统会将 cron 错误日志记录到 /var/log/syslog 或 /var/log/cron,而非自定义文件。
排查建议:
grep "CRON.*mssql" /var/log/syslog # Ubuntu/Debian
grep "CROND.*mssql" /var/log/cron # CentOS/RHEL
总结
最可能原因:目录内文件权限限制导致 root 用户删除失败,或 -mtime +7 未匹配到文件。建议优先调整任务执行用户为 mssql 或检查文件时间戳匹配逻辑。
执行命令记录:
find /data/backup/file/mssql/ -mindepth 1 -maxdepth 1 -mtime +7 -exec rm -rf {} \;
sudo systemctl restart crond
cd /data/backup/file/mssql
crontab -e
chown -R root:root /data/backup/file/mssql/