在rails应用程序(或sinatra)中,如果我调用shell命令,那么在此命令的运行环境下?当通过ruby调用shell命令时,该命令运行的上下文是什么?
我不知道我是否正确地问我的问题,但它是否在轨道进程相同的线程中运行?
当你失控时,是否有可能使这是一个异步调用?如果是的话,这是否意味着在操作系统层面它将启动一个新线程?它可以在一个线程池而不是一个新线程中启动吗?
在rails应用程序(或sinatra)中,如果我调用shell命令,那么在此命令的运行环境下?当通过ruby调用shell命令时,该命令运行的上下文是什么?
我不知道我是否正确地问我的问题,但它是否在轨道进程相同的线程中运行?
当你失控时,是否有可能使这是一个异步调用?如果是的话,这是否意味着在操作系统层面它将启动一个新线程?它可以在一个线程池而不是一个新线程中启动吗?
如果您正在使用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
这不仅仅是一个新的线程更多,这是一个完全独立的过程。它将是同步的,并且在命令完成之前控制不会返回到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和一些设置,但如果你需要这样的控制,这很好。