在 Go 中確定進程是否存在
在 Go 中,os.FindProcess 函數可用於透過 PID 檢索進程。但是,如果這個函數回傳錯誤,是否一定表示進程已經終止?
檢查進程是否存在
根據kill(2的手冊頁)在Unix 中,向進程發送0 信號實際上並沒有發送信號,而是檢查進程是否處於活動狀態。這種方法可以在 Go 中進行調整,以確定進程是否存在。
Go 實現
以下 Go 代碼演示了這種技術:
package main import ( "fmt" "log" "os" "strconv" "syscall" ) func main() { for _, p := range os.Args[1:] { pid, err := strconv.ParseInt(p, 10, 64) if err != nil { log.Fatal(err) } process, err := os.FindProcess(int(pid)) if err != nil { fmt.Printf("Failed to find process: %s\n", err) } else { err := process.Signal(syscall.Signal(0)) fmt.Printf("process.Signal on pid %d returned: %v\n", pid, err) } } }
範例輸出
執行時,此程式碼會顯示多個行程的狀態:
$ ./kill 1 $$ 123 process.Signal on pid 1 returned: operation not permitted process.Signal on pid 12606 returned:process.Signal on pid 123 returned: no such process
在此範例中,進程 1 傳回錯誤,因為它不屬於目前使用者。進程 12606 傳回 nil,因為它處於活動狀態並由使用者擁有。進程 123 回傳錯誤,因為它不再存在。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3