ホームページ >バックエンド開発 >Golang >Go Beyond os.FindProcess でプロセスの存在を確実に確認する方法

Go Beyond os.FindProcess でプロセスの存在を確実に確認する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-07 12:32:03991ブラウズ

How to Reliably Check for Process Existence in Go Beyond os.FindProcess?

os.FindProcess だけに依存せずに Go でプロセスの存在を確認する方法

Go でプロセスを扱うとき、自然os.FindProcess を利用して、指定された PID を持つプロセスが存在するかどうかを判断する傾向があります。ただし、この方法だけに依存すると、不正確な結論につながる可能性があります。

os.FindProcess の制限

os.FindProcess は、オペレーティング システムにプロセスに関する情報を効果的に問い合わせます。 。指定された PID を持つプロセスが存在する場合、エラー以外の結果が返されます。ただし、プロセスがすでに終了している場合でも、オペレーティング システムがまだプロセスを取得していない (つまり、システムのプロセス テーブルからそのエントリを削除していない) 場合、os.FindProcess は成功を報告することがあります。これは、プロセスが実際には終了しているのにまだ実行中であることを示唆する誤検知につながる可能性があります。

代替ソリューションの探索: シグナルの送信

確実にチェックするにはプロセスが存在する場合は、ターゲット プロセスに 0 (ゼロ) のシグナルを送信するという従来の Unix アプローチを採用できます。この手法が機能する理由:

  • プロセスが生きている場合、0 のシグナルの送信は悪影響を引き起こすことなく成功します。
  • プロセスが終了した場合、0 のシグナルを送信します。 「そのようなプロセスはありません」というエラー メッセージが表示されて失敗します。

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 サイトの他の関連記事を参照してください。

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