Si vous regardez Nginx, il appelle "nginx reload" pourse recharger. Existe-t-il un moyen d'envoyer un signal de la ligne de commande à un processus en cours? Même si le processus principal démarre des processus enfants, comment puis-je envoyer des commandes au principal pour avertir ses enfants?
ex:
myapp start -debug // starts a server
myapp reload -gracefull // stops the app gracefully
Maintenant, je dois envoyer des signaux OS pour informer mon serveur d'effectuer un arrêt gracieux
kill -QUIT pid
kill -USR2 pid
J'espère que ma question est assez claire Thnx
Réponses:
7 pour la réponse № 1Jetez un oeil à la os/signal
paquet.
Le signal de package implémente l'accès aux signaux entrants.
Il y a même un Exemple dans la documentation:
// Set up channel on which to send signal notifications.
// We must use a buffered channel or risk missing the signal
// if we"re not ready to receive when the signal is sent.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)
// Block until a signal is received.
s := <-c
fmt.Println("Got signal:", s)
Envoyer des signaux
Pour voir comment envoyer des signaux, regardez signal_test.go
, il utilise syscall
. Par exemple :
// Send this process a SIGHUP
t.Logf("sighup...")
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
waitSig(t, c, syscall.SIGHUP)
0 pour la réponse № 2
J'ai compris que dans go i, nous pouvons passer l'environnement à syscall.Exec
err := syscall.Exec(argv0. os.Args. os.Environ())
copie simplement l'env en cours dans le processus enfant.