1

我们有一个 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`

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

#!/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

但我正在尝试找到一种无需包装器的方法。可能吗?

4

2 回答 2

0

根据Upstart Intro、Cookbook 和 Best Practices,点4.2.2,您可以在$HOME/.init/.

于 2013-09-26T02:02:11.050 回答
0

不,这是不可能的。

当您使用“反引号”运算符时,您实际上是在调用Kernel#system(...). 这意味着您执行的命令在子shell 中运行,该子shell无法以您想要的方式更改父进程的环境。

请参阅此问题进行比较:如何在 ruby​​ Kernel.exec 之后运行代码

还可以考虑阅读有关UNIX 进程模型的更多信息。

于 2013-09-26T01:20:40.070 回答