当同一命令在命令行上工作时,如何通过Ruby Shell命令运行应用程序

时间:2018-12-19 04:27:59

标签: ruby process fork sinatra

我有一个简单的Ruby(Sinatra)服务器,该服务器从命令行ruby app.rb启动就没有问题。但是,当我通过command line app通过`ruby app.rb`system("ruby app.rb")执行相同的命令时,出现此错误:

app.rb:1:in `require': cannot load such file -- sinatra (LoadError)
    from app.rb:1:in `<main>'

app.rb的开头行就是require 'sinatra'。当然,Sinatra gem已安装在我的系统中;我不明白为什么解释器会表现得好像不在那里一样。

在进行故障排除时,我决定将Sinatra添加到正在调用app.rb的命令行应用程序的Gemfile中。瞧,既然父进程可以访问Sinatra,它现在就可以工作了(即system(app.rb)成功启动了Sinatra服务器)。但是当我退出命令行应用程序时,总是有Sinatra服务器在说:

[2018-12-18 23:17:37] INFO  WEBrick 1.3.1
[2018-12-18 23:17:37] INFO  ruby 2.4.0 (2016-12-24) [x86_64-linux]
== Sinatra (v2.0.4) has taken the stage on 4567 for development with backup from WEBrick
[2018-12-18 23:17:37] INFO  WEBrick::HTTPServer#start: pid=27384 port=4567

所以我必须按Ctrl-c退出命令行应用程序。

问题:是否有一种方法可以生成独立的Sinatra进程/服务器,就像我尝试使用system("ruby app.rb")一样,而无需将其安装在父应用程序(命令行应用程序)中?我也尝试过使用Process.fork和Process.wait,但这没有帮助。

1 个答案:

答案 0 :(得分:1)

自回答,因为我找到了解决方案,没有其他人回答过:

执行以下操作,而不是只执行ruby app.rb(它本身与周围的程序在相同的环境中运行并因此使用相同的Gemfile)(忽略生成的脚本中引用的那个),而是执行:

system("BUNDLE_GEMFILE='./Gemfile' && ruby app.rb")

仅此而已!这告诉Ruby在运行程序时加载正确的gemfile。


个人笔记:非常感谢大家在上面关于问题的讨论中,以及当地的Ruby小组,我最好的朋友和我12岁的编码员儿子(实际上提供了确切的代码)。现在,我只需要弄清楚如何在不停止周围程序的情况下停止所产生的过程。不能只使用“ Ctrl-C”。但这是一个不同的问题!