os.FindProcess だけに依存せずに Go でプロセスの存在を確認する方法
Go でプロセスを扱うとき、自然os.FindProcess を利用して、指定された PID を持つプロセスが存在するかどうかを判断する傾向があります。ただし、この方法だけに依存すると、不正確な結論につながる可能性があります。
os.FindProcess の制限
os.FindProcess は、オペレーティング システムにプロセスに関する情報を効果的に問い合わせます。 。指定された PID を持つプロセスが存在する場合、エラー以外の結果が返されます。ただし、プロセスがすでに終了している場合でも、オペレーティング システムがまだプロセスを取得していない (つまり、システムのプロセス テーブルからそのエントリを削除していない) 場合、os.FindProcess は成功を報告することがあります。これは、プロセスが実際には終了しているのにまだ実行中であることを示唆する誤検知につながる可能性があります。
代替ソリューションの探索: シグナルの送信
確実にチェックするにはプロセスが存在する場合は、ターゲット プロセスに 0 (ゼロ) のシグナルを送信するという従来の Unix アプローチを採用できます。この手法が機能する理由:
Go でのシグナルベースのソリューションの実装
これを使用する Go 関数の例を次に示します。アプローチ:
package main import ( "fmt" "log" "os" "os/signal" "strconv" ) // checkProcessExistence sends a signal of 0 to a process to determine its existence. func checkProcessExistence(pid int) bool { process, err := os.FindProcess(pid) if err != nil { log.Fatal(err) } err = process.Signal(signal.Signal(0)) if err != nil { return false } return true } func main() { for _, p := range os.Args[1:] { pid, err := strconv.ParseInt(p, 10, 64) if err != nil { log.Fatal(err) } if checkProcessExistence(int(pid)) { fmt.Printf("Process with PID %d is running\n", pid) } else { fmt.Printf("Process with PID %d is not running\n", pid) } } }
使用例
プロセス A の PID があり、プロセス A がまだ実行中かどうかを確認したいとします:
$ go run main.go 12345 Process with PID 12345 is running
この出力は、プロセス 12345 が実際に生きていることを確認します。
以上がGo Beyond os.FindProcess でプロセスの存在を確実に確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。