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