J'exécute un long programme Linux sur une machine distante et je veux l'arrêter, mais mon problème est que si j'utilise la commande kill, le programme se fermera sans enregistrer les résultats. Normalement, ce que je fais pour terminer le programme utilise ctrl c et dans ce cas, le programme enregistre les résultats, mais pour l'instant je ne suis pas dans la machine qui exécute la session, donc je ne peux pas faire ctrl c.
Ma question est: existe-t-il un moyen de faire à distance l'équivalent de ctrl c?.
Essayer:
kill -SIGINT processPIDHere
Fondamentalement Ctrl C envoie le signal SIGINT
(interruption) tandis que kill envoie le signal SIGTERM
(terminaison) par défaut, sauf si vous spécifiez le signal à envoyer.
ctrl c envoie juste un signal SIGINT, mais il y a d'autres signaux un peu plus doux. http://www.gnu.org/software/libtool/manual/libc/Termination-Signals.html
Je pense que vous pouvez utiliser la commande the kill pour envoyer un autre signal. (voir man kill pour plus d'informations)
Si vous contrôlez le processus distant de longue durée, vous pouvez installer un gestionnaire de signaux pour SIGTERM (voir man signal
et man sigaction
et les nombreuses SO questions sur ce sujet), pour bien nettoyer avant de mourir.
C'est une chose très courante à faire.
Voici un exemple pour mongod
Pour démarrer le démon à partir de la ligne de commande:
mongod &
Puis plus tard
kill -SIGINT `pgrep mongod`
Gardez également à l'esprit dans votre gestionnaire de signaux, que c'est comme un gestionnaire d'interruptions dans la mesure où vous êtes très limité quant à ce que vous êtes autorisé à faire dedans sans corrompre le reste de votre programme. La meilleure chose que vous puissiez faire ici est de définir une variable atomic_t "should_quit".
Je fais comme ci-dessous
killall -2 <ProgramName>
ou
kill -2 <PID of your process>
J'avais l'habitude d'oublier le nom du signal. c'est-à-dire SIGINT/SIGKILL ici, donc j'utilise des nombres pour cela comme killall -2 ou killall -9