【问题标题】:ruby script specific gemset backickruby 脚本特定的 gemset backick
【发布时间】:2013-10-01 18:48:51
【问题描述】:

我们有一个 rails sidekiq 设置来运行作业。

我试图通过将实际脚本与 sidekiq 调用分开来使工作尽可能可移植。

所以 sidekiq 调用了一个小存根作业,该作业反引号调用实际脚本并捕获输出。

那部分工作正常。但是 sidekiq 以 root 身份运行该作业,而不是以拥有所有 rvm 部件、rubies 和 gemset 的环境的用户身份运行。我想使用现有的用户 rvm rubies 和 gemsets。

在调用脚本(sidekiq 作业)中:

output = `source /path/to/dudes/rvm/environment.file && rvm use  \ 
2.0.0-pxxx@default do ruby /path/to/actual/script.rb`

然后调用的脚本开始运行,但是以 root 身份运行,它显然不能按我的预期工作,因为我的要求没有找到。

如果我使用相同的命令字符串并以 BASH 的本地用户身份运行它,该用户也没有 gemsets,它似乎可以工作。

我试过像 shell 脚本一样调用它

output = `/path/to/actual/script.rb`

...在被调用的脚本中,各种shebang组合。

#!/usr/bin/env ruby
#!/usr/bin/env rvm use everything i found on the internets

现在,我已经使用 bash 脚本包装器让 ruby​​ 脚本在具有 linux upstart 作业的环境中运行,如下所示: http://techhelplist.com/index.php/tech-tutorials/43-linux-adventures/85-upstart-ruby-job-with-rvm

但我正在尝试找到一种不使用包装器的方法。有可能吗?

【问题讨论】:

    标签: ruby linux rvm sidekiq gemset


    【解决方案1】:

    不,这是不可能的。

    当您使用"backtick" operator 时,您实际上是在调用Kernel#system(...)。这意味着您执行的命令是在 subshel​​l 中运行的,它无法以您想要的方式更改 父进程 的环境。

    查看这个问题进行比较:How to run code after ruby Kernel.exec

    还可以考虑阅读有关UNIX process model 的更多信息。

    【讨论】:

    • 但是在这种情况下,我不是想改变子进程的环境吗?我想基本上复制或模仿从父母到孩子的环境。我可能没有把那部分说清楚。即使我必须让子进程运行一些东西来手动加载环境,也没关系
    【解决方案2】:

    根据Upstart Intro, Cookbook and Best Practises,指向4.2.2,可以在$HOME/.init/中设置用户作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多