2017-07-28 128 views
0

嗨我正在處理一個簡單的代碼,它將監視進程並在進程崩潰的情況下重新啓動進程。我寫了一個小樣本代碼。等待非子進程結束

這是我的外部進程

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    for { 
     time.Sleep(1000 * time.Millisecond) 
     fmt.Println("hello") 
    } 
} 

這是監視它的代碼。

package main 

import (
    "fmt" 
    "os" 
) 

func main() { 
    p, e := os.FindProcess(<processid>) 
    fmt.Println(e) 
    fmt.Println(p.Wait()) 
    fmt.Println("done") 
} 

這裏的挑戰是,由於第一個過程是不是第二個的子過程,它不會等待而直接退出。 如果有人對此有任何想法,請讓我知道。

謝謝。

+0

您是否嘗試過使用go-ps? https://github.com/mitchellh/go-ps 還是gops? https://github.com/google/gops – pltvs

回答

0

由於p.Wait()沒有阻塞,所以監控進程退出。

docs

在大多數操作系統中,這個過程必須是當前 進程的子或將返回一個錯誤。

您可以輪詢進程池以檢查進程是否仍然存在。

+0

您是否知道任何輪詢機制,管道是一種方法,但希望實施較簡單的解決方案 – Pharaoh

+0

您可以嘗試上面評論中列出的軟件包之一。例如,使用go-ps並循環地間歇性地檢查進程可執行文件以查看進程是否仍在運行。管道可能很複雜,但它們會是一個更好的解決方案。 – abhink