crontab任务未执行、日志未生成及MTA提示问题的语法排查
crontab任务未执行、日志未生成及MTA提示问题的语法排查
兄弟,你的问题核心是踩了crontab相对路径的坑,我给你一步步拆解原因和解决方案:
为什么任务没执行?
crontab运行定时任务时,默认的工作目录是根目录/,不是你平时登录系统后的用户主目录。所以你写的那些相对路径全出问题了:
rm ./rehldslog:实际是要删除/rehldslog,这个文件大概率不存在,rm会报错,而&&是「只有前面命令成功才执行后面」的逻辑,所以后面的cd、rm -rf build、build.sh全被直接跳过了,自然看不到build目录被删除的效果。cd ./code/rehlds:同样是找根目录下的code/rehlds,肯定也不存在,就算前面的rm没报错,这一步也会失败中断后续命令。
那个MTA提示是什么意思?
这个是次要问题:crontab默认会把任务的输出(包括错误信息)通过邮件发给当前用户,但你的系统没装邮件传输代理(MTA),它没法发邮件,就会打印这个提示。它不是任务失败的原因,只是任务失败后,crontab想报告错误却做不到的附带提示。
修正后的crontab条目
把所有相对路径换成绝对路径,再给rm加个-f避免文件不存在时报错中断,示例如下(记得把~/换成你实际的用户主目录绝对路径也可以,比如/home/yourname/):
10 5 * * * rm -f ~/rehldslog && cd ~/code/rehlds && rm -rf ./build && ./build.sh --compiler=gcc --jobs=4 > ~/rehldslog 2>&1
如果想更稳妥,把所有命令用大括号包起来,确保所有输出(包括中间步骤的错误)都能写入日志,方便排查:
10 5 * * * { rm -f ~/rehldslog && cd ~/code/rehlds && rm -rf ./build && ./build.sh --compiler=gcc --jobs=4; } > ~/rehldslog 2>&1
验证方法
先手动执行修正后的完整命令,确认能正常运行后,再更新crontab,这样能提前排除命令本身的问题。
备注:内容来源于stack exchange,提问作者eetzt
相关产品推荐
相关产品推荐

