Maison >développement back-end >Golang >Comment vérifier de manière fiable l'existence d'un processus dans Go Beyond os.FindProcess ?

Comment vérifier de manière fiable l'existence d'un processus dans Go Beyond os.FindProcess ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-07 12:32:031114parcourir

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

Comment vérifier l'existence d'un processus dans Go sans s'appuyer uniquement sur os.FindProcess

Lorsqu'il s'agit de processus dans Go, le naturel L’inclination est d’utiliser os.FindProcess pour déterminer si un processus avec un PID spécifié existe. Cependant, se fier uniquement à cette méthode peut conduire à des conclusions inexactes.

Les limites de os.FindProcess

os.FindProcess interroge efficacement le système d'exploitation pour obtenir des informations sur un processus. . Si le processus avec le PID spécifié existe, il renvoie un résultat sans erreur. Cependant, si le processus est déjà terminé, os.FindProcess peut toujours signaler un succès si le système d'exploitation n'a pas encore récupéré le processus (c'est-à-dire, supprimé son entrée de la table des processus du système). Cela peut conduire à des faux positifs, suggérant qu'un processus est toujours en cours alors qu'il est effectivement terminé.

Explorer une solution alternative : envoyer un signal

Pour vérifier de manière fiable l'existence d'un processus, nous pouvons utiliser l'approche Unix traditionnelle consistant à envoyer un signal de 0 (zéro) au processus cible. Cette technique fonctionne parce que :

  • Si le processus est vivant, l'envoi d'un signal de 0 réussira sans provoquer d'effets indésirables.
  • Si le processus est terminé, l'envoi d'un signal de 0 échouera avec le message d'erreur "aucun processus de ce type".

Implémentation de la solution basée sur le signal dans Go

Voici un exemple de fonction Go qui utilise ceci approche :

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)
        }
    }
}

Exemple d'utilisation

Supposons que vous ayez le PID du processus A et que vous souhaitiez vérifier s'il est toujours en cours d'exécution :

$ go run main.go 12345
Process with PID 12345 is running

Cette sortie confirme que le processus 12345 est bien vivant.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn