You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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脚本,彻底避免环境变量问题:

  1. 先生成wrapper(如果用了gemset,把@redmine换成你的gemset名称,没用到就去掉):
rvm wrapper ruby-3.0.0@redmine bundle rake
  1. 修改脚本使用生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:52:14