2013-03-19 36 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和一些設置,但如果你需要這樣的控制,這很好。