Est-il dangereux de fermer une fenêtre de terminal sans quitter correctement une application?

18

En utilisant Ubuntu 12.04 LTS, ma question est que si j'ai démarré une application dans une fenêtre de terminal, y a-t-il quelque chose de mal à simplement fermer la fenêtre de terminal sans quitter l'application correctement au préalable. Par exemple, j'utilise MATLAB. J'ouvre un terminal et tape

matlab -nodisplay -nodesktop -nosplash

puis exécutez un tas de scripts. Ensuite, je peux soit

exit

pour terminer MATLAB, puis fermez la fenêtre du terminal ou fermez simplement la fenêtre du terminal. Quelle est vraiment la différence entre ces deux méthodes? La deuxième méthode "nuit-elle" à quelque chose? La première méthode est-elle préférée? Pourquoi?

Un point fixe
la source

Réponses:

22

En général, cela devrait être bien de le faire de cette façon.

Lorsque vous cliquez sur le "X" pour fermer la fenêtre du terminal, cela envoie un "signal" de votre bureau (GNOME, KDE, etc.) à l'application du terminal, lui disant de s'arrêter. Puisque vous exécutez MATLAB dans ce shell, il est considéré comme un processus enfant pour l'application terminale.

Donc, une partie des responsabilités d'être un processus parent est que vous envoyez à son tour ce même «signal» proche à vos enfants.

Maintenant, si vous comprenez conceptuellement ce que je viens d'expliquer, substituons un peu plus la vraie terminologie.

signaux

Tout d'abord avec le "signal", il existe en fait toute une famille de signaux différents que vous pouvez envoyer aux processus Unix. Pour faire simple , il y a 4 que vous verrez souvent SIGHUP, SIGTERM, SIGINTet SIGKILL.

  • SIGHUP

    Le signal SIGHUP est envoyé à un processus lorsque son terminal de commande est fermé. Il a été initialement conçu pour notifier le processus de coupure de ligne série. Dans les systèmes modernes, ce signal signifie généralement que le contrôle du pseudo-terminal ou du terminal virtuel a été fermé.

  • SIGTERM

    Le signal SIGTERM est un signal générique utilisé pour provoquer l'arrêt du programme. Contrairement à SIGKILL, ce signal peut être bloqué, traité et ignoré. C'est la manière normale de demander poliment à un programme de se terminer.

  • SIGINT

    Le signal SIGINT («interruption de programme») est envoyé lorsque l'utilisateur tape le caractère INTR (normalement Cc).

  • SIGKILL

    Le signal SIGKILL est utilisé pour provoquer l'arrêt immédiat du programme. Il ne peut pas être manipulé ou ignoré et est donc toujours fatal. Il n'est pas non plus possible de bloquer ce signal.

REMARQUE: SIGINT est ce qui est envoyé lorsque vous utilisez Ctrl+ Cpour "casser" un programme à partir de la ligne de commande alors qu'il est en cours d'exécution.

lequel s'habitue?

Il est très probable que le SIGTERMsoit appelé par votre environnement de fenêtrage et transmis à votre terminal. Votre terminal envoie alors probablement SIGHUPà MATLAB. Ce signal donne à tous les processus la possibilité d'effectuer eux-mêmes tout nettoyage local (fermeture de fichiers, fin de processus, etc.).

commande kill

Vous pouvez envoyer des signaux vous à l' aide de la commande mal nommée, kill. Donc, pour envoyer le SIGTERMsignal à votre terminal ou au SIGHUP to MATLAB, you could determine their PID usingps` puis exécutez cette commande pour leur envoyer le signal:

$ kill -SIGTERM <PID>

ou ca:

$ kill -SIGHUP <PID>

Vous pouvez obtenir une liste complète des signaux en utilisant cette commande:

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...
...

Remarquez que les signaux ont des chiffres? Vous les verrez souvent utilisés comme ça au lieu de leurs noms:

$ kill -15 <PID>

Ou l'infâme -9, qui peut tuer à peu près n'importe quel processus.

slm
la source
J'ai toujours pensé que ces chiffres étaient négatifs, mais ce sont en fait des arguments de ligne de commande. J'ai appris quelque chose de nouveau: D
Thomas
1
HUP - HangUP - est le signal qui est envoyé si vous "perdez la ligne" pour un terminal, par exemple si vous étiez connecté à un serveur Unix par modem. C'est probablement le signal le plus "doux" qui met fin à un processus. La plupart des démons ne quitteront pas mais reliront leurs fichiers de configuration sur HUP. La commande nohup vous permet de laisser un processus d'arrière-plan se poursuivre après la fermeture du shell. Des commandes comme screen survivent au blocage et isolent les commandes qu'il contient de HUP.
Baard Kopperud
@BaardKopperud - merci, j'ai intentionnellement laissé HUP de côté, je ne voulais pas confondre la discussion.
slm
@BaardKopperud - Je pense que ce que vous signalez est le suivant: "Le signal SIGHUP est envoyé à un processus lorsque son terminal de commande est fermé. Il a été initialement conçu pour notifier le processus d'une chute de ligne série. Dans les systèmes modernes, ce signal signifie généralement que le contrôle du pseudo ou du terminal virtuel a été fermé "J'avoue avoir menti un peu dans ma description mais j'essayais de rester simple.
slm
@BaardKopperud - Je me sentais coupable, j'ai donc modifié ma réponse pour refléter plus précisément ce qui se passe. Merci!
slm
2

C'est très probablement correct, mais vous perdrez des données en fonction des applications ouvertes. Par exemple, si un éditeur de fichiers est ouvert, vous risquez de perdre certaines de vos modifications si vous n'enregistrez pas et ne quittez pas correctement. Si vous êtes inquiet, déconnectez-vous / quittez le terminal correctement. Si vous n'aimez pas taper exitou logoutessayez simplement Ctrl-D.

marque
la source
Pourquoi serait-ce mieux? L'application va obtenir SIGHUP au lieu de SIGTERM, mais elle est toujours tuée par un signal, donc je ne l'appellerais pas exactement "enregistrer et quitter correctement"
Michael Mrozek
Pour autant Ctrl-D, cela ne s'applique vraiment qu'à l'invite de commande.
Mark