我正在尝试从cron运行Ruby脚本。
该脚本使用Bundler来管理gem依赖项。由于cron不能在$PWD
中运行,因此我每次都会从Bundler中找到“无法找到Gemfile”错误,这是有道理的,因为从cron运行时Gemfile不在currrent路径中。
有没有办法告诉Bundler使用不在当前路径中的Gemfile?
答案 0 :(得分:41)
最好的办法是将cd
放入您的cron中的相关目录中。您还可以使用BUNDLE_GEMFILE
环境变量指向Gemfile。如果您对BUNDLE_GEMFILE
有任何问题,请let us know。
答案 1 :(得分:2)
您可以让主脚本更改其目录:
Dir.chdir File.dirname(__FILE__)
您可能需要使用File.expand_path
调整它以获取应用的根目录(Gemfile
所在的位置)。假设您的脚本是/apps/myapp/bin/main.rb
; chdir
行将是:
Dir.chdir File.expand_path('../..', __FILE__)
当然,你必须确保你的应用程序不会因为chdir而中断 - 但如果你是cd
在cron中,它就不应该。
如果脚本是守护程序,并且您希望在正常操作期间将其更改为根目录/
,则可以在调用Bundler.setup
或Bundler.require
后执行此操作。
虽然你可以在cron中做cd
,但我不愿意,因为crons已经足够难以阅读和维护。