Ubuntu服务器Cron脚本执行无输出问题求助
我来帮你排查这个Cron脚本执行无输出的问题,咱们一步步来:
1. 先修复Crontab的命令格式错误
这是最明显的问题:你在sudo crontab -e里配置的命令前面多写了root。因为sudo crontab -e编辑的本身就是root用户的定时任务,不需要在command字段再指定用户。
错误的配置:
0 2 * * * root /usr/bin/perl /var/backup/backup.pl * * * * * root /bin/sh /var/backup/checkHealth.sh
正确的配置应该改成:
# m h dom mon dow command 0 2 * * * /usr/bin/perl /var/backup/backup.pl * * * * * /var/backup/checkHealth.sh
(因为你的checkHealth.sh已经设置了执行权限,且开头有#!/bin/bash的shebang,直接调用脚本路径即可,不需要用/bin/sh来启动)
从你的cron日志里也能看出来问题:CMD (root /bin/sh /var/backup/checkHealth.sh) —— Cron把root当作了/bin/sh的第一个参数,而不是用户,这会导致命令执行失败,自然没有输出。
2. 解决Cron环境变量缺失的问题
Cron的默认PATH非常窄(通常只有/usr/bin:/bin),而你的脚本里用到的curl、service、mysql、tomcat8这些命令,可能不在Cron的PATH里,导致脚本执行时找不到命令,从而静默失败。
解决方法:
- 先查这些命令的绝对路径:
which curl which service which mysql which tomcat8 - 然后把脚本里的命令替换成绝对路径,比如把
curl改成/usr/bin/curl,service改成/usr/sbin/service(根据你实际查到的路径)。
另外,也可以在脚本开头手动设置PATH,比如:
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 后面的脚本内容...
3. 手动验证脚本是否正常工作
先手动运行脚本,确认脚本本身没有问题:
sudo /var/backup/checkHealth.sh
然后查看/var/log/test.log和/var/log/test.err.log是否有输出。如果手动运行都没有输出,那问题出在脚本本身,比如curl的目标地址是否能访问,或者if [ $CODE -gt 300 ]的判断逻辑是否有问题(比如当curl失败时,$CODE可能不是数字,导致判断报错)。
4. 检查日志文件的权限
确保/var/log/test.log和/var/log/test.err.log存在,且root用户有写入权限:
ls -l /var/log/test.log /var/log/test.err.log # 如果文件不存在,先创建: sudo touch /var/log/test.log /var/log/test.err.log sudo chown root:root /var/log/test.log /var/log/test.err.log
5. 增加Cron级别的输出重定向(用于排查)
如果上面的步骤还没解决问题,可以在Cron命令里额外重定向输出,捕获所有执行时的错误信息:
* * * * * /var/backup/checkHealth.sh >> /var/log/cron_checkhealth_full.log 2>&1
这样所有的stdout和stderr都会写入/var/log/cron_checkhealth_full.log,方便你看Cron执行时到底出了什么问题。
按照上面的步骤一步步排查,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Climbatize

