在rails应用程序(或sinatra)中,如果我调用shell命令,该命令在什么上下文中运行?
我不确定我是否正确地提出了我的问题,但它是否与rails进程在同一个线程中运行?
当你出局时,是否可以将其作为异步呼叫?如果是,这是否意味着在操作系统级别它会启动一个新线程?它可以从线程池而不是新线程开始吗?
答案 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和一些设置,但如果您需要这种级别的控制,那就很好。