2017-10-28 49 views
0

使用跨平臺的解決方案(GNU/Linux,Windows),我想在後臺產生一個外部程序,捕獲它的pid,稍後通過存儲的pid停止程序。Process.spawn(Ruby 1.9.x):如何檢查產卵是否成功並檢測錯誤?

考慮的Ruby 1.9.x的驗證碼:

pid = Process.spawn("xxx") 
puts pid 

標準輸出/標準錯誤:

8117 
sh: 1: xxx: not found 

沒有拋出異常,我看不出有什麼方法來檢測的事實該產卵不成功(xxx不是一個有效的命令)。

什麼是最好的方式來檢測這種產卵不成功?

回答

1

Process#spawn返回進程ID。如果你得到一個進程ID,那麼從技術上來說,函數本身並沒有失敗。在Ruby> = 2.0.0中,如果Process#spawn未能找到該命令,它將拋出Errno::ENOENT。由於ruby 1.9不受支持,最好的解決方案是升級ruby。

可能會有幫助的黑客將測試過程是否在呼叫返回後實際運行。可悲的是,這將是特定於平臺的。

pid = Process.spawn("xxx") 
case RUBY_PLATFORM 
when /linux/i 
    success = File.exist?("/proc/#{pid}") 
when /windows/i 
    # use win32api gem, Windows API call EnumProcesses 
else 
    # ? 
end 

不幸的是,如果過程在您測試其存在的時間結束時,您不能說。你可能想檢查它的結果(無論它做什麼),看看它是否也做到了。

另一種方法,如果你控制着程序的啓動,就是在啓動之前打開一個命名管道,讓它發送一個消息到你正在運行的管道上。您可以在spawn以非阻塞方式呼叫之後從管道中讀取數據,並使用Timeout來防止永久阻塞。一個更簡單,不太乾淨的方法是讓該程序爲文件寫一些確定性的內容,然後使用簡單的File.exist?測試來查看它是否存在。

+0

這很有幫助。謝謝。 – cschol