Cron运行Ruby脚本twilio_send_text.rb失败,遇twilio-ruby加载错误
嘿,这个问题我之前帮好几个开发者搞定过——Cron运行时的环境变量和你平时登录终端用的环境完全不一样,所以它找不到你已经安装的twilio-ruby gem,才会抛出那个LoadError。下面给你几个靠谱的解决办法,按顺序试试就行:
方法1:指定Ruby的完整路径运行脚本
首先打开终端,输入which ruby,拿到你平时开发用的Ruby路径(比如/usr/local/bin/ruby或者rbenv/rvm管理的路径,绝对不是系统默认的/System/Library/...那个)。然后修改你的Cron任务,用这个完整路径来执行脚本,比如:* * * * * /usr/local/bin/ruby /Users/nicolassaltarelli/Desktop/playing/twilio_send_text.rb方法2:在脚本里手动添加gem路径
先在终端里跑gem environment gemdir,得到你的gem安装目录(比如/Users/nicolassaltarelli/.rbenv/gems/ruby-2.7.4)。然后在你的twilio_send_text.rb最顶部加上这段代码,强制Ruby加载正确的gem:require 'rubygems' Gem.clear_paths Gem.path << "/Users/nicolassaltarelli/.rbenv/gems/ruby-2.7.4" # 换成你自己的gem路径 require 'twilio-ruby'方法3:让Cron加载你的用户环境配置
Cron默认不会加载你的bash/zsh配置文件,所以可以在Cron任务里先加载配置,再跑脚本。如果用bash,就写:* * * * * source $HOME/.bash_profile && ruby /Users/nicolassaltarelli/Desktop/playing/twilio_send_text.rb要是用zsh,就把
.bash_profile换成.zshrc就行。方法4:用Bundler管理依赖(如果你的项目用了Gemfile)
要是你的脚本所在目录有Gemfile和Gemfile.lock,直接用bundle exec来运行脚本,它会自动帮你找到正确的gem版本:* * * * * cd /Users/nicolassaltarelli/Desktop/playing && bundle exec ruby twilio_send_text.rb记得要先cd到脚本所在目录,不然Bundler找不到Gemfile哦。
另外,你可以先模拟Cron的环境测试脚本,避免反复改Cron等半天:在终端里执行env -i /bin/bash -c "ruby /Users/nicolassaltarelli/Desktop/playing/twilio_send_text.rb",如果这里报错,说明就是环境的问题,解决后再改Cron就稳了。
内容的提问来源于stack exchange,提问作者Nick Saltarelli

