launchctl - 在执行的脚本中使用 rvm 而不是系统 Ruby?

launchctl - 在执行的脚本中使用 rvm 而不是系统 Ruby?

我有一个 launchctl 工作,我定义如下:

<key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>-c</string>
        <string>~/projects/script.sh</string>
    </array>

当我手动运行 script.sh 时,该脚本运行良好,因为它使用当前配置的 ruby​​ 的 rvm 版本。当我通过 launchctl 运行此脚本时,系统使用了 Ruby 的某个版本,这会破坏脚本。如何在有正确版本的 Ruby 的情况下运行此脚本?

答案1

在调用任何依赖于正确设置的程序之前,更改script.sh为设置环境变量。PATHPATH

答案2

最好的方法是使用 rvm“包装器”,它会加载 ruby​​ 环境然后运行脚本。更多信息:

$ rvm help wrapper

例子:

$ rvm wrapper 2.0.0 hello
$ hello_ruby -e "puts RUBY_VERSION"
$ hello_rake -T
$ which hello_ruby # => /Users/me/.rvm/bin/hello_ruby

...ETC...

您可以在 launchd 配置中使用“/Users/me/.rvm/bin/hello_ruby”作为可执行文件,然后 rvm 环境将为您设置。

这也非常好,无需指定确切的 ruby​​ 版本,因此当补丁级别出来时,升级 rvm 并且您的包装器将指向较新的修补 ruby​​,而无需卸载/加载启动文件。

相关内容