cron.d中重定向命令仅创建日志文件却无内容写入的问题求助
问题原因及解决办法
这个问题我之前也碰到过,核心原因是cron的运行环境和日常命令行环境存在差异,具体可以拆解成这几个点:
可能的原因
- 命令路径找不到:cron默认的
PATH环境变量非常窄(通常只有/usr/bin:/bin),如果你在命令行里直接用mycommand能运行,但cron里找不到这个命令的位置,导致命令根本没执行,自然不会有日志内容。 - Shell语法不兼容:
&>是Bash的扩展语法,用来同时重定向标准输出(stdout)和标准错误(stderr)。但cron默认使用的是POSIX标准的sh,sh不认识&>,会把它解析成“后台运行命令”+“仅重定向stdout”,结果要么命令执行异常,要么错误输出没写入日志。 - 缺少依赖的环境变量或权限不足:命令行执行时你当前用户的环境变量(比如
JAVA_HOME、PYTHONPATH)和权限,cron不一定拥有。如果命令依赖这些变量,或者cron用的用户没有执行/写入权限,命令会执行失败,无输出。
对应的解决办法
- 使用命令的绝对路径:先在命令行里执行
which mycommand,得到命令的绝对路径(比如/usr/local/bin/mycommand),然后把cron任务里的mycommand替换成这个绝对路径。 - 改用POSIX兼容的重定向语法:把
&>换成标准写法> /var/log/mylog 2>&1,这个写法在sh和Bash里都能正常工作,确保stdout和stderr都写入日志。 - 让cron用Bash执行任务:在cron文件的开头添加一行
SHELL=/bin/bash,这样cron就会用Bash来解析命令,&>语法就能正常生效了。 - 配置cron的环境变量:如果命令依赖特定环境变量,可以直接在cron文件里设置,比如:
PATH=/usr/local/bin:/usr/bin:/bin JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # 下面是你的定时任务,示例为每分钟执行一次 * * * * * mycommand &> /var/log/mylog - 查看cron的邮件日志:cron默认会把任务的错误输出发送到当前用户的本地邮件,执行
mail -u 你的用户名可以查看邮件内容,里面通常会有命令执行失败的具体原因,帮你快速排查问题。
内容的提问来源于stack exchange,提问作者Paolo Benvenuto
相关产品推荐
相关产品推荐

