亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查后臺啟動的進程是否仍在運行?

如何檢查后臺啟動的進程是否仍在運行?

Go
慕婉清6462132 2023-07-10 14:47:11
看起來如果您通過exec.Cmd和Start()創建一個子進程,該Cmd.Process字段會立即填充,但Cmd.ProcessState字段會保留nil到進程退出為止。?// ProcessState contains information about an exited process,? ?// available after a call to Wait or Run.? ?ProcessState *os.ProcessStateStart()所以看起來我實際上無法檢查我編輯的進程仍在運行時的狀態?ProcessState當進程退出時,設置對我來說毫無意義。在這種情況下,有一個ProcessState.Exited()方法將始終返回true。所以我嘗試走這條路線:cmd.Process.Pidfield 在 I 之后就存在cmd.Start(),但是看起來os.Process沒有公開任何機制來檢查進程是否正在運行。os.FindProcess說:在 Unix 系統上,FindProcess 始終成功并返回給定 pid 的進程,無論該進程是否存在。這是沒有用的——而且似乎沒有辦法從os.Process轉到os.ProcessState除非你.Wait()違背了整個目的(我想知道進程在退出之前是否正在運行)。
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

我認為你在這里有兩個合理的選擇:

  • 分離一個等待進程退出的 goroutine。等待完成后,您就知道進程已退出。(正面:很容易正確編碼;負面:你專門有一個操作系統線程來等待。)

  • syscall.Wait4()在已發布的Pid.?A?Wait4with?syscall.WNOHANGset 立即返回,填寫狀態。

如果有一個導出的函數oscmd函數可以為您執行此操作Wait4并填充 ProcessState,那就太好了。您可以提供WNOHANG也可以不提供,只要您認為合適即可。但沒有。


要點ProcessState.Exited()是區分所有各種可能性,包括:

  • 進程正常退出(帶有狀態字節)

  • 進程因接收到未處理的信號而終止

請注意,還有比這兩種更多的可能性......只是似乎沒有辦法讓其他人進入ProcessState.?唯一的調用syscall.Wait似乎是:

  • syscall/exec_unix.go:失敗后exec,在返回錯誤之前收集僵尸;和

  • os/exec_unix.go: 撥打電話后p.blockUntilWaitable().

如果不是blockUntilWaitable,的exec_unix.go實現變體wait()可以調用syscall.Wait4with?syscall.WNOHANG,但blockUntilWaitable它本身確保這是毫無意義的(并且這個特定的目標wait是無論如何都要等待退出)。


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號