通过ruby调用shell命令时,命令运行的是什么上下文?

时间:2013-03-19 21:33:42

标签: ruby-on-rails ruby linux ubuntu

在rails应用程序(或sinatra)中,如果我调用shell命令,该命令在什么上下文中运行?

我不确定我是否正确地提出了我的问题,但它是否与rails进程在同一个线程中运行?

当你出局时,是否可以将其作为异步呼叫?如果是,这是否意味着在操作系统级别它会启动一个新线程?它可以从线程池而不是新线程开始吗?

2 个答案:

答案 0 :(得分:1)

如果您正在使用system('cmd')或只是反对:

`cmd`

然后该命令将在子shell的上下文中执行。 如果您希望一次运行多个,可以使用Rubys fork功能:

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

这将创建多个subprocessess,它们在各自的子shell中运行各个命令。

在这里阅读分叉:http://www.ruby-doc.org/core-2.0/Process.html#method-c-fork

答案 1 :(得分: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 gem非常适合排队和管理后台作业。它需要Redis和一些设置,但如果您需要这种级别的控制,那就很好。