Cron任务未执行命令求助:备份任务调度异常
我之前也碰到过好几次这种Cron明明触发了,但里面的命令就是不跑的情况,大概率是环境、权限或者日志没跟上的问题,给你几个实用的排查和解决方向:
先搞定环境变量的问题
Cron的执行环境和你平时登录shell的环境完全不一样,很多你在终端里能直接用的命令,Cron根本找不到。比如backup命令,你可以先在终端里运行which backup,拿到它的绝对路径(比如/home/roy/.rbenv/shims/backup),然后把Cron里的命令换成这个绝对路径,避免Cron找不到命令。
另外,如果用了rbenv、rvm这类Ruby版本管理工具,也可以在命令前加上环境加载的语句,比如source ~/.bash_profile && /home/roy/.rbenv/shims/backup perform -t my_backup,确保Cron能加载到正确的Ruby环境。检查权限是否足够
确认Cron运行的用户(也就是roy用户)有没有执行backup命令的权限,还有访问备份配置文件、写入备份目标路径的权限。比如你可以手动用roy用户运行一遍backup perform -t my_backup,看看能不能正常执行,如果手动都报错,那Cron肯定也跑不起来。给命令加日志,抓错误信息
Cron默认不会输出任何执行日志,你根本不知道它为啥失败。最直接的办法是把命令的输出重定向到日志文件里,修改你的schedule.rb:every 1.minute do command "/home/roy/.rbenv/shims/backup perform -t my_backup >> /home/roy/backup_cron.log 2>&1" end然后重新更新Cron任务:
whenever --update-crontab,等一分钟后查看/home/roy/backup_cron.log,里面会清楚显示哪里出了问题——是找不到命令,还是配置文件报错,一目了然。确认Whenever的环境配置
如果你的Backup配置分了开发、生产环境,记得在schedule.rb里指定正确的环境,比如:set :environment, :production every 1.minute do command "/home/roy/.rbenv/shims/backup perform -t my_backup >> /home/roy/backup_cron.log 2>&1" end这样Whenever生成的Cron任务会加载对应环境的配置,避免因为环境不匹配导致命令执行失败。
内容的提问来源于stack exchange,提问作者royketelaar

