2013-03-19 33 views
0

在rails应用程序(或sinatra)中,如果我调用shell命令,那么在此命令的运行环境下?当通过ruby调用shell命令时,该命令运行的上下文是什么?

我不知道我是否正确地问我的问题,但它是否在轨道进程相同的线程中运行?

当你失控时,是否有可能使这是一个异步调用?如果是的话,这是否意味着在操作系统层面它将启动一个新线程?它可以在一个线程池而不是一个新线程中启动吗?

回答

1

如果您正在使用system('cmd')或者干脆反引号:

`cmd` 

则命令将在子shell的上下文中执行。 如果你想在同一时间运行的这些多重,你可以使用RUBYS叉功能:

fork { system('cmd') } 
fork { system('cmd') } 

这将创造出在各自的子shell运行各个命令多个subprocessess。

阅读上分叉位置:http://www.ruby-doc.org/core-2.0/Process.html#method-c-fork

0

这不仅仅是一个新的线程更多,这是一个完全独立的过程。它将是同步的,并且在命令完成之前控制不会返回到Ruby。如果你想有一个发射后不管的解决方案,你可以简单的后台任务:

$ irb 

irb(main):001:0> system("sleep 30 &") 
=> true 
irb(main):002:0> 

$ ps ax | grep sleep 

3409 pts/4 S  0:00 sleep 30 

你通过system("foo &")`foo &`希望您可以开始尽可能多的进程。

如果您想要更好地控制从Ruby启动后台进程,包括正确分离ttys和其他东西,请查看daemons gem。这更适合于想要管理的长时间运行的流程,包含PID文件等,但也可以使用它启动任务。

根据您的需要,还有其他管理后台进程的解决方案。 resque宝石很受排队和管理后台工作的欢迎。它需要Redis和一些设置,但如果你需要这样的控制,这很好。