无法通过crontab运行脚本,Shell中可正常执行求排查
解决Crontab运行脚本失败的问题
我来帮你一步步排查并修复这个问题,你的脚本在登录Shell里能正常运行,但Crontab里报错,主要是几个常见的Crontab脚本陷阱导致的:
1. 修复错误的Shebang行
你的脚本第一行写的是#$/bin/bash,这是致命错误!正确的Shebang应该是#!/bin/bash(注意开头是!而不是$)。这个错误会让系统用默认的sh来执行脚本,而sh不支持Bash特有的(( ... ))算术判断语法,这大概率是引发奇怪错误的根源。
2. 处理Crontab的环境变量限制
Crontab运行时的环境非常精简,PATH比你登录Shell的PATH短很多,很多命令的路径可能不在Crontab的默认PATH里。哪怕你觉得命令路径没问题,也建议用绝对路径调用所有外部命令:
- 先在登录Shell里执行
which sendmail,得到它的绝对路径(比如/usr/sbin/sendmail),然后把脚本里的sendmail替换成这个完整路径。 - 你已经用了
/usr/games/cowsay的绝对路径,这个没问题,可以保留。
3. 优化邮件内容的写法
你脚本里的echo -e换行写法在Crontab里容易出现转义问题,建议改用Here-doc语法来构造邮件内容,更清晰也更稳定:
修正后的完整脚本
#!/bin/bash DIR=/var/log REC="foo@bar.com foo@bar.de" TOTALFILES="$(/home/pi/scripts/count-files-dirs $DIR | cut -d' ' -f2)" if (( "$TOTALFILES" > 36 )); then cat << EOF | /usr/sbin/sendmail $REC Subject: $(date +%A' '%d' '%B' '%G) PI-07 var/log status $(/usr/games/cowsay moh moh moh) EOF else true fi
4. 调试小技巧(如果还有问题)
如果修改后还是报错,可以在Crontab条目里添加日志重定向,把所有输出和错误都记录下来:
# 比如每天凌晨1点运行脚本,日志输出到/tmp目录 0 1 * * * /home/pi/scripts/check-files >> /tmp/cron_check_files.log 2>&1
查看/tmp/cron_check_files.log就能看到更详细的错误信息,方便进一步排查。
内容的提问来源于stack exchange,提问作者PlodyIce
相关产品推荐
相关产品推荐

