Signaux de capture de Golang
Je veux mettre en œuvre un processus "wrapper" en Aller. Essentiellement, ce qu'il va faire, c'est lancer un processus (disons un nœud de serveur) et de le surveiller (capture des signaux tels que la SIGKILL, SIGTERM ...)
Je pense que la façon de le faire est de lancer le serveur de nœud en routine à l'aide de syscall.Exec
:
func launchCmd(path string, args []string) {
err := syscall.Exec(path, args, os.Environ())
if err != nil {
panic(err)
}
}
J'aimerais ensuite pour attraper tous les signaux possibles générés par la commande exécutée par syscall
. Je suis assez nouveau à l'Aller, toute aide serait appréciée.
source d'informationauteur rmonjo
Vous devez vous connecter pour publier un commentaire.
Il y a trois façons de l'exécution d'un programme en Aller:
syscall
paquet avec syscall.Execsyscall.ForkExecsyscall.StartProcessos
paquet avec os.StartProcessos/exec
paquet avec exec.Commandesyscall.StartProcess est de faible niveau. Elle renvoie une
uintptr
comme un manche.os.StartProcess
vous donne une belleos.Process
struct que vous pouvez appeler Signal.os/exec
vous donneio.ReaderWriter
à utiliser sur un tuyau. Les deux utilisentsyscall
en interne.La lecture des signaux envoyés de un processus autre que votre propre semble un peu délicat. Si c'était possible,
syscall
serait en mesure de le faire. Je ne vois rien d'évident dans le niveau supérieur de paquets.Pour recevoir un signal, vous pouvez utiliser signal.Informer comme ceci:
Vous avez juste besoin de modifier les signaux que vous êtes intéressés à écouter. Si vous ne spécifiez pas un signal, il va prendre tous les signaux qui peuvent être capturés.
Vous utilisez syscall.Tuer ou Processus.Signal à la carte le signal. Vous pouvez obtenir le pid de
Process.Pid
ou comme un résultat de syscall.StartProcess.Vous pouvez utiliser signal.Informer :