使用whenever gem创建Cron任务遇错:bundler: not executable: bin/rails
解决whenever gem执行runner时的"bundler: not executable: bin/rails"报错
这个问题我之前碰到过好几次,大多是因为cron的运行环境和你本地shell环境不一致,或者binstubs权限、whenever的自动命令生成逻辑导致的,给你几个一步步排查解决的方案:
先检查bin/rails的可执行权限
cron执行任务时的权限可能比你本地用户更严格,先确保bin/rails有执行权限:chmod +x bin/rails执行完这个命令后,重新更新crontab:
whenever --update-crontab调整whenever的schedule.rb配置,明确环境和路径
很多时候报错是因为whenever生成的命令没正确指定项目路径和环境,你可以在schedule.rb里补充这些配置:# 顶部添加全局配置 set :path, '/绝对路径/到你的rails项目根目录' set :environment, 'production' # 换成你实际用的环境,比如development set :output, { error: 'log/cron_error.log', standard: 'log/cron.log' } # 方便排查日志 # 你的定时任务 every 1.hours do runner "DailyAttendance.fetch_data" end然后重新更新crontab,记得指定环境:
whenever --update-crontab --set environment=production手动验证生成的crontab命令是否正确
运行crontab -l查看生成的定时任务命令,正常应该是类似这样的:0 * * * * /bin/bash -l -c 'cd /你的项目路径 && bundle exec rails runner -e production "DailyAttendance.fetch_data"'如果里面没有
bundle exec,或者路径不对,你可以直接用command方式代替runner,手动指定完整命令:every 1.hours do command "cd /你的项目路径 && bundle exec rails runner 'DailyAttendance.fetch_data' -e production" end这种方式更可控,避免whenever自动生成的命令出问题。
确认cron能找到bundle和rails的路径
cron默认的PATH环境变量非常窄,可能找不到你的bundle或者rails。你可以在whenever里指定PATH:set :default_environment, { 'PATH' => '/usr/local/bin:/usr/bin:/bin:/你的ruby安装路径/bin' # 用`which bundle`和`which rails`查路径,加进去 }这样cron执行时就能找到对应的命令了。
内容的提问来源于stack exchange,提问作者Santosh Kumbhar
相关产品推荐
相关产品推荐

