在Ruby中,我運行了一個系統(「command here」),它不斷監視文件的變化,類似於尾部。我希望我的程序繼續運行,而不是在system()調用中停止。 Ruby中有沒有辦法創建另一個進程,以便兩者都可以獨立運行,將結果輸出到終端,然後當您退出程序時,創建的應用程序的所有進程都將被刪除?Ruby運行兩個進程,將結果輸出到終端,並安全結束
1
A
回答
2
2
你不想使用system
作爲等待過程來完成。您可以使用spawn
,然後使用wait(避開殭屍)。然後,當你想退出時,發送一個SIGTERM到你產生的進程。您也可以使用fork
來啓動您的子進程,但如果您使用外部程序,則spawn
可能更容易。
您也可以使用進程組而不是跟蹤所有進程ID,然後一個Process.kill('TERM', -process_group_id)
調用將處理事情。您的子進程應該在同一個進程組中結束,但如果您需要,則有Process.setpgid
。
下面是一個使用fork
(更容易將它全部封裝在一個包中)的示例。
def launch(id, sleep_for)
pid = Process.fork do
while(true)
puts "#{id}, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep(sleep_for)
end
end
# No zombie processes please.
Process.wait(pid, Process::WNOHANG)
pid
end
# These just forward the signals to the whole process group and
# then immediately exit.
pgid = Process.getpgid(Process.pid())
Signal.trap('TERM') { Process.kill('TERM', -pgid); exit }
Signal.trap('INT') { Process.kill('INT', -pgid); exit }
launch('a', 5)
launch('b', 3)
while(true)
puts "p, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep 2
end
如果運行在一個終端,然後從另一個殺死它(使用shell的kill
命令),你會看到,孩子們也被打死。如果你刪除了「將這個信號轉發給整個過程組」Signal.trap
的東西,那麼一個簡單的SIGTERM會讓這些孩子仍然在運行。
所有這些都假設你正在某種Unixy系統(例如Linux或OSX),YMMV等其他地方工作。
0
還有一次使用Spawn的投票。我們在生產中使用它很多,而且非常穩定。
相關問題
- 1. pycharm終端並運行給出不同的結果
- 2. 將兩個bash循環結果值輸出到同一行?
- 3. 將兩個結果合併到一個結果集中mysql
- 4. 將結果輸出到erb
- 5. 用C++運行一個進程,過濾輸出並得到結果代碼並得到系統錯誤,一起
- 6. start-job並行運行命令並輸出結果
- 7. 終端輸出不是邏輯分析儀得到的結果
- 8. ssh進入終端並保存終端輸出到文件
- 9. Bash文件:並行運行進程,並在其中一個結束時停止
- 10. 運行過程openfiles輸出結果到文件
- 11. 將輸出重定向到兩個進程併合並
- 12. 將兩個併發程序的輸出與bash結合使用
- 13. Mac OSX:運行一個避免輸入sudo密碼並在執行結束時關閉終端的腳本
- 14. 輸出這兩個表的結果
- 15. 將兩個查詢的結果合併爲一個結果SQL
- 16. ASP.net:我如何運行Reflection.Type,並將結果輸出到webform文本框中?
- 17. 運行一個perl腳本,需要輸出結果到VB.net
- 18. 是std :: map ::結束線程安全,並保證它始終相同的容器?
- 19. 從一個表中進行選擇並查找另一個表並在輸出結果中獲得結果
- 20. 熊貓:比較每兩行並輸出結果到一個新的數據幀
- 21. PHP PDO選擇並輸出第一個找到的行結果
- 22. 從兩個SQL語句合併結果到一個呈現出新的結果
- 23. 在OSX Lion的終端中安裝並運行ruby腳本
- 24. 將結果作爲網格/單行結果集輸出到多行
- 25. (存儲程序)將結果2行合併爲1行結果
- 26. 運行w32tm並將結果賦值給變量給出不同的輸出
- 27. 如何解析ffprobe輸出並根據結果運行ffmpeg?
- 28. 如何在C#中運行tracetcp並獲取輸出結果?
- 29. 批處理:將查詢結果輸出到CSV結果
- 30. ruby on rails解析字符串並將結果輸出到現有表中
當程序退出時是否想要殺死所有的子進程,或者是否希望在退出之前等待子進程完成? –
程序退出時終止所有子進程。兩個進程都在監視文件的變化,所以兩者都不會完成。 – jaysonp