Redmine到期任务提醒脚本Cron执行遇bundle相关错误求助
解决Redmine到期任务提醒脚本crontab执行失败问题
我写了个脚本用来发送Redmine到期任务提醒,手动运行完全正常,但配置crontab自动执行时就失败了,错误日志显示bundle: command not found。
原始脚本
#!/bin/bash cd /opt/redmine-5.0.2 bundle exec rake redmine:send_reminders days=1 RAILS_ENV="production"
尝试的修改
我试过在脚本里加上bundle的完整路径,修改后的脚本如下:
#!/bin/bash cd /opt/redmine-5.0.2 /usr/local/rvm/gems/ruby-3.0.0/bin/bundle exec rake redmine:send_reminders days=1 RAILS_ENV="production"
但这时又出现新错误:
bundler: failed to load command: rake (/usr/local/rvm/gems/ruby-3.0.0/bin/rake) /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/spec_set.rb:87:in `block in materialize': Could not find rake-13.0.6 in any of the sources (Bundler::GemNotFound) from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/spec_set.rb:81:in `map!' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/spec_set.rb:81:in `materialize' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/definition.rb:175:in `specs' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/definition.rb:245:in `specs_for' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/definition.rb:227:in `requested_specs' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/runtime.rb:91:in `block in definition_method' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/runtime.rb:20:in `setup' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler.rb:149:in `setup' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/setup.rb:20:in `block in <top (required)>' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/ui/shell.rb:136:in `with_level' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/ui/shell.rb:88:in `silence' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/setup.rb:20:in `<top (required)>' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:61:in `require_relative' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:61:in `kernel_load' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:28:in `run' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli.rb:497:in `exec' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli.rb:30:in `dispatch' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/base.rb:485:in `start' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/cli.rb:24:in `start' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/bundler-2.2.3/libexec/bundle:49:in `block in <top (required)>' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/3.0.0/bundler/friendly_errors.rb:130:in `with_friendly_errors' from /usr/local/rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/bundler-2.2.3/libexec/bundle:37:in `<top (required)>' from /usr/local/rvm/gems/ruby-3.0.0/bin/bundle:23:in `load' from /usr/local/rvm/gems/ruby-3.0.0/bin/bundle:23:in `<main>'
问题原因
crontab的执行环境变量和用户手动登录的环境完全不同,它不会加载用户的shell配置文件(比如.bashrc、.bash_profile),导致RVM、Ruby、Bundler的环境变量都没正确设置——哪怕指定了bundle的绝对路径,也找不到对应的gem依赖。
解决方法
方法1:在脚本中加载RVM环境
修改脚本,先加载RVM的初始化脚本,确保Ruby和Bundler的环境正确:
#!/bin/bash # 加载RVM环境 source /usr/local/rvm/scripts/rvm # 切换到指定的Ruby版本 rvm use ruby-3.0.0 # 进入Redmine目录 cd /opt/redmine-5.0.2 # 执行提醒命令 bundle exec rake redmine:send_reminders days=1 RAILS_ENV="production"
方法2:使用RVM Wrapper生成独立执行脚本
用RVM的wrapper功能生成包含完整环境的bundle和rake脚本,彻底避免环境变量问题:
- 先生成wrapper(如果用了gemset,把
@redmine换成你的gemset名称,没用到就去掉):
rvm wrapper ruby-3.0.0@redmine bundle rake
- 修改脚本使用生成的wrapper路径:
#!/bin/bash cd /opt/redmine-5.0.2 /usr/local/rvm/wrappers/ruby-3.0.0@redmine/bundle exec /usr/local/rvm/wrappers/ruby-3.0.0@redmine/rake redmine:send_reminders days=1 RAILS_ENV="production"
方法3:在crontab中指定完整环境变量
编辑crontab(执行crontab -e),在任务前先设置必要的环境变量:
PATH=/usr/local/rvm/gems/ruby-3.0.0/bin:/usr/local/rvm/rubies/ruby-3.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOME=/home/your-user # 这里替换成你的执行时间,比如每天凌晨2点 0 2 * * * /opt/redmine-5.0.2/your-script.sh
把your-user替换成实际运行脚本的用户,调整时间表达式符合你的需求。
验证方法
修改后可以先手动运行脚本测试,或者临时设置crontab每分钟执行一次,查看/var/log/cron日志或用户邮件,确认脚本是否正常运行。
内容的提问来源于stack exchange,提问作者lệ việt
相关产品推荐
相关产品推荐

