È dannoso chiudere una finestra del terminale senza uscire correttamente da un'applicazione?


18

Usando Ubuntu 12.04 LTS, la mia domanda è che se avessi avviato un'applicazione in una finestra del terminale, allora c'è qualcosa di male nel chiudere semplicemente la finestra del terminale senza uscire dall'applicazione correttamente prima. Ad esempio, utilizzo MATLAB. Apro un terminale e scrivo

matlab -nodisplay -nodesktop -nosplash

e quindi eseguire un sacco di script. Quindi posso farlo

exit

per terminare MATLAB e quindi chiudere la finestra del terminale o semplicemente chiudere la finestra del terminale. Qual è davvero la differenza tra questi due metodi? Il secondo metodo in qualche modo "danneggia" qualcosa? Il primo metodo è preferito? Perché?

Risposte:


22

In generale questo dovrebbe andare bene per farlo in questo modo.

Quando si fa clic sulla "X" per chiudere la finestra del terminale, si sta inviando un "segnale" dal desktop (GNOME, KDE, ecc.) All'applicazione del terminale, dicendogli di chiudersi. Dal momento che stai eseguendo MATLAB in questa shell è considerato un processo figlio per l'applicazione terminale.

Quindi parte delle responsabilità di essere un processo genitore è che a sua volta invii questo stesso "segnale" vicino ai tuoi figli.

Ora, se capisci concettualmente ciò che ho appena spiegato, sostituiamo un po 'di più la vera terminologia.

segnali

Innanzitutto con il "segnale", in realtà esiste un'intera famiglia di segnali diversi che è possibile inviare ai processi Unix. Per mantenere le cose semplici ci sono 4 che si vedono spesso, SIGHUP, SIGTERM, SIGINT, e SIGKILL.

  • SIGHUP

    Il segnale SIGHUP viene inviato a un processo quando il suo terminale di controllo è chiuso. È stato originariamente progettato per notificare il processo di caduta della linea seriale. Nei sistemi moderni, questo segnale di solito significa che il controllo di pseudo o terminale virtuale è stato chiuso.

  • SIGTERM

    Il segnale SIGTERM è un segnale generico utilizzato per causare la chiusura del programma. A differenza di SIGKILL, questo segnale può essere bloccato, gestito e ignorato. È il modo normale di chiedere educatamente a un programma di terminare.

  • SIGINT

    Il segnale SIGINT ("interruzione programma") viene inviato quando l'utente digita il carattere INTR (normalmente Cc).

  • SIGKILL

    Il segnale SIGKILL viene utilizzato per causare la chiusura immediata del programma. Non può essere gestito o ignorato ed è quindi sempre fatale. Inoltre, non è possibile bloccare questo segnale.

NOTA: SIGINT è ciò che viene inviato quando si utilizza Ctrl+ Cper "interrompere" un programma dalla riga di comando mentre è in esecuzione.

quale si sta abituando?

Molto probabilmente SIGTERMviene chiamato dall'ambiente di finestre e trasmesso al terminale. È quindi probabile che il tuo terminale invii SIGHUPa MATLAB. Questo segnale offre a tutti i processi l'opportunità di eseguire da soli qualsiasi ripulitura locale (chiusura di file, processi di chiusura, ecc.).

comando di uccisione

È possibile inviare i segnali da soli utilizzando il comando infelicemente chiamato, kill. Quindi, per inviare il SIGTERMsegnale al tuo terminale o SIGHUP to MATLAB, you could determine their PID usingps` e quindi eseguire questo comando per inviare loro il segnale:

$ kill -SIGTERM <PID>

o questo:

$ kill -SIGHUP <PID>

Puoi ottenere un elenco completo dei segnali usando questo comando:

$ 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
...
...

Notare che i segnali hanno numeri? Spesso le vedrai usate in quel modo invece che con i loro nomi:

$ kill -15 <PID>

O il famigerato -9, che può uccidere praticamente qualsiasi processo.


Ho sempre pensato che quei numeri fossero negativi, ma in realtà sono argomenti da riga di comando. Ho imparato qualcosa di nuovo: D
Thomas,

1
HUP - HangUP - è il segnale che viene inviato se si "perde la linea" per un terminale, ad esempio si è collegati a un server Unix via modem. È probabilmente il segnale più "gentile" che interrompe un processo. La maggior parte dei demoni non esce ma rilegge i propri file di configurazione su HUP. Il comando nohup ti consente di continuare un processo in background dopo la chiusura della shell. I comandi come lo schermo sopravvivono al blocco e isola i comandi in esso contenuti da HUP.
Baard Kopperud,

@BaardKopperud - grazie, ho intenzionalmente lasciato fuori HUP, non volevo confondere la discussione.
slm

@BaardKopperud - Penso che ciò che stai sottolineando sia questo: "Il segnale SIGHUP viene inviato a un processo quando il suo terminale di controllo è chiuso. È stato originariamente progettato per notificare il processo di caduta di una linea seriale. Nei sistemi moderni, questo segnale di solito significa che il controllo di pseudo o terminale virtuale è stato chiuso "Ammetto di aver mentito un po 'nella mia descrizione, ma stavo cercando di mantenerlo semplice.
slm

@BaardKopperud - Mi sono sentito in colpa, quindi ho modificato la mia risposta per riflettere più accuratamente ciò che sta succedendo. Grazie!
slm

2

Molto probabilmente va bene, ma perderai i dati a seconda delle applicazioni che hai aperto. Ad esempio, se hai un editor di file aperto, potresti perdere alcune delle modifiche se non salvi e chiudi correttamente. Se sei preoccupato, basta disconnettersi / uscire dal terminale correttamente. Se non ti piace digitare exito logoutsemplicemente provare Ctrl-D.


Perché sarebbe meglio? L'applicazione otterrà SIGHUP invece di SIGTERM, ma viene comunque ucciso da un segnale, quindi non lo chiamerei esattamente "salva ed esci correttamente"
Michael Mrozek

Per quanto riguarda ciò Ctrl-D, si applica solo al prompt dei comandi.
Segna il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.