ホームページ  >  記事  >  バックエンド開発  >  Go でプロセスの存在を確認する信頼できる方法はありますか?

Go でプロセスの存在を確認する信頼できる方法はありますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 22:34:02976ブラウズ

Is There a Reliable Way to Determine Process Existence in Go?

os.FindProcess を使用した Go でのプロセスの存在の確認

os.FindProcess を使用すると、プロセスの存在に関する情報が得られますが、完全に信頼できるわけではありません

Unix アプローチの利用

伝統的に、Unix コマンド kill -s 0 [PID] を使用して、プロセスが終了したか強制終了されたかを確認します。プロセスがまだ実行中です。このアプローチでは、実際のシグナルは送信されずに、プロセスに 0 のシグナルが送信されます。代わりに、プロセスの存在を確認する方法として機能します。

Go での実装

このメソッドを Go に変換すると、次のコードはプロセスかどうかを判断する方法を示します。はまだアクティブです:

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "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)
        }
    }
}

出力例

このコードを実行すると、異なる ID を持つプロセスのステータスを示す次の出力が提供されます:

$ ./kill 1 $$ 123
process.Signal on pid 1 returned: operation not permitted
process.Signal on pid 12606 returned: <nil>
process.Signal on pid 123 returned: no such process
  • プロセス 1: 生きていますが、現在のユーザーが所有していません。
  • プロセス 12606: 生きており、現在のユーザーが所有しています。
  • プロセス 123: 終了または強制終了されました。

以上がGo でプロセスの存在を確認する信頼できる方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。