Ruby on rails 在其他应用程序的上下文中运行命令

Ruby on rails 在其他应用程序的上下文中运行命令,ruby-on-rails,capistrano,bundler,system-calls,Ruby On Rails,Capistrano,Bundler,System Calls,我在同一台服务器上有两个rails应用程序,我们称它们为A和B 我正在尝试让应用程序A通过应用程序B自己的capistrano任务重新启动应用程序B。不幸的是,即使在cd刻录到应用程序B的目录后,它仍试图运行应用程序A的capistrano。我错过什么了吗 示例代码 system(“cd/apps/appB/current&&pwd&&bundle exec cap:restart”) pwd正确返回appB的路径(/apps/appB/current),但是,在中有cap:restart的回溯

我在同一台服务器上有两个rails应用程序,我们称它们为A和B

我正在尝试让应用程序A通过应用程序B自己的capistrano任务重新启动应用程序B。不幸的是,即使在cd刻录到应用程序B的目录后,它仍试图运行应用程序A的capistrano。我错过什么了吗

示例代码

system(“cd/apps/appB/current&&pwd&&bundle exec cap:restart”)

pwd正确返回appB的路径(/apps/appB/current),但是,在中有cap:restart的回溯。这是因为它仍在尝试在appA的上下文中运行cap命令,例如


/apps/appA/shared/bundle/ruby/1.9.1/gems/capistrano-2.15.4/lib/capistrano/configuration/loading.rb:152:在“require”中:无法加载此类文件--airbrake/capistrano(LoadError)
从/apps/appA/shared/bundle/ruby/1.9.1/gems/capistrano-2.15.4/lib/capistrano/configuration/loading.rb:152:in'require'。

我尝试了不使用“bundle exec”的方式,并尝试了其他一些进行系统调用的方式。我还在另一个目录中创建了一个bash脚本,并尝试以这种方式运行它

所描述的所有方法表现出相同的行为


非常感谢您的帮助=)

因为您说您的应用程序正在使用Unicorn,所以您可以从应用程序A向应用程序B发送信号(或者反过来)

阅读本页:

每个应用程序只需要知道另一个应用程序的pidfile路径。所以,看看你的独角兽配置,看看它存储在哪里

您可以从该PID文件中读取PID并从Ruby中删除它:

pid = File.read(path_to_other_application_pidfile).chop
Process.kill("USR2", pid)
或者可以使用反勾号来执行shell命令

`kill -s USR2 \`cat #{path_to_other_application_pidfile}\``

既然你说你的应用程序正在使用Unicorn,你可以从应用程序A向应用程序B发送信号(或者反过来)

阅读本页:

每个应用程序只需要知道另一个应用程序的pidfile路径。所以,看看你的独角兽配置,看看它存储在哪里

您可以从该PID文件中读取PID并从Ruby中删除它:

pid = File.read(path_to_other_application_pidfile).chop
Process.kill("USR2", pid)
或者可以使用反勾号来执行shell命令

`kill -s USR2 \`cat #{path_to_other_application_pidfile}\``

您需要使用
Bundler.with_clean_env
以确保您的子流程不会拾取当前的Bundler环境:

Bundler.with_clean_env do
系统(“cd/apps/appB/current&&pwd&&bundle exec cap:重新启动”)
结束

这本质上与您需要使用
绑定器的问题相同。使用_clean_env
可确保您的子流程不会拾取当前的绑定器环境:

Bundler.with_clean_env do
系统(“cd/apps/appB/current&&pwd&&bundle exec cap:重新启动”)
结束

这本质上与appb中的问题相同,您是否为capistranoyeah进行了捆绑安装?我在appb中进行了捆绑安装Gemfile是否有capistrano?您使用的是什么应用服务器?如果您使用的是Unicorn,您可以通过直接向其他应用程序发送信号来重新启动,而无需使用capistrano。@bratsche我与foreman一起使用Unicorn,我可能只需要与foreman一起使用,谢谢。我仍然希望找到一种通过rails实现的方法,因为我想研究如何使用appA作为其他应用程序的完整控制中心,并希望在将来的某个时候将其扩展到部署。在appb中,您是否为Capistranoyah完成了捆绑安装?在appb中,我已经完成了。Gemfile中有capistrano吗?您使用的是什么应用服务器?如果您使用的是Unicorn,您可以通过直接向其他应用程序发送信号来重新启动,而无需使用capistrano。@bratsche我与foreman一起使用Unicorn,我可能只需要与foreman一起使用,谢谢。我仍然希望找到一种通过rails实现的方法,因为我想研究使用appA作为其他应用程序的完整控制中心,并希望在将来的某个时候将其扩展到部署。