我们有一个rails sidekiq设置来运行作业。
我试图通过将实际脚本与sidekiq调用分开来使作业尽可能便携。
所以sidekiq调用一个小的存根作业,该反向作业会调用实际脚本并捕获输出。
那部分工作正常。但是sidekiq以root身份运行工作,而不是环境中拥有所有rvm部件,rubies和gemsets的用户。我想使用现有的用户rvm rubies和gemsets。
在调用脚本(sidekiq job)中:
output = `source /path/to/dudes/rvm/environment.file && rvm use \
2.0.0-pxxx@default do ruby /path/to/actual/script.rb`
并且被调用的脚本运行,但是作为root用户显然无法正常工作,因为找不到我的要求。
如果我使用相同的命令字符串并将其作为BASH的本地用户运行,而BASH也没有gemsets,它似乎可以工作。
我尝试过将其称为shell脚本
output = `/path/to/actual/script.rb`
...在被调用的脚本中,各种各样的组合。
#!/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
但是我试图找到一种没有包装器的方法。有可能吗?
答案 0 :(得分:0)
当您使用"backtick" operator时,您实际上是在呼叫Kernel#system(...)
。这意味着您执行的命令在子shell 中运行,该命令无法以您希望的方式更改父进程的环境。
请参阅此问题进行比较:How to run code after ruby Kernel.exec
另请考虑详细了解UNIX process model。
答案 1 :(得分:0)
根据 Upstart Intro, Cookbook and Best Practises ,指向4.2.2
,您可以在$HOME/.init/
中设置用户工作。