You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:05