Cron执行shell脚本仅echo生效xargs rm失效,手动sh调用正常如何解决
问题原因排查
- 非交互环境下
sudo执行失败
你的cron任务已经指定以root用户运行脚本,本身就具备/var/log目录下文件的删除权限,不需要额外加sudo。且cron运行时没有交互终端,若/etc/sudoers中存在Defaults requiretty配置,sudo命令会直接终止执行,导致后续的xargs rm无法运行。 - 管道逻辑掩盖了前面命令的执行状态
脚本中rm命令之后直接管道接echo "test",无论前面的删除命令是否执行成功,echo和wall都会正常执行,所以你收到终端广播不代表删除逻辑运行成功。 - 脚本路径不匹配
crontab中配置的执行路径是/etc/file.sh,请确认你编写的file.sh确实已移动到/etc目录下,若路径错误只会执行空脚本,自然不会触发删除操作。 - 通配符匹配结果不足
如果find /var/log/*.gz匹配到的压缩日志文件数量少于5个,tail -n +6不会输出任何内容,xargs rm自然没有可删除的目标,该情况属于正常逻辑。
修复步骤
- 修改
file.sh脚本内容,去掉多余的sudo,调整管道逻辑,增加边界判断:
#!/bin/sh # 先判断匹配到的文件数量是否满足删除条件 FILE_COUNT=$(find /var/log -name "*.gz" | wc -l) if [ $FILE_COUNT -ge 6 ]; then find /var/log -name "*.gz" -printf "%T@ %Tc %p\n" | sort -n | tail -n +6 | xargs rm -f fi echo "test" | wall
- 确认脚本路径正确,配置对应权限:
mv file.sh /etc/ chmod +x /etc/file.sh chown root:root /etc/file.sh
内容的提问来源于stack exchange,提问作者Grafik Krystian
相关产品推荐
相关产品推荐

