Czy zamykanie okna terminala bez właściwego zamykania aplikacji jest szkodliwe?

18

Używając Ubuntu 12.04 LTS, moje pytanie brzmi: jeśli uruchomię aplikację w oknie terminala, to czy jest coś złego w samym zamknięciu okna terminala bez uprzedniego prawidłowego wyjścia z aplikacji. Na przykład używam MATLAB. Otwieram terminal i piszę

matlab -nodisplay -nodesktop -nosplash

a następnie uruchom kilka skryptów. Więc mogę albo

exit

aby zakończyć MATLAB, a następnie zamknąć okno terminala lub po prostu zamknąć okno terminala. Jaka jest naprawdę różnica między tymi dwiema metodami? Czy druga metoda w jakiś sposób coś „szkodzi”? Czy preferowana jest pierwsza metoda? Dlaczego?

Fixed Point
źródło

Odpowiedzi:

22

Zasadniczo powinno być w porządku robić to w ten sposób.

Kiedy klikniesz „X”, aby zamknąć okno terminala, wysyła „sygnał” z twojego pulpitu (GNOME, KDE itp.) Do aplikacji terminala, informując go, aby się zamknął. Ponieważ uruchamiasz MATLAB w tej powłoce, jest to proces potomny dla aplikacji terminalowej.

Tak więc częścią obowiązków bycia rodzicem jest to, że z kolei wysyłasz ten sam bliski „sygnał” do swoich dzieci.

Teraz, jeśli rozumiesz koncepcyjnie to, co właśnie wyjaśniłem, zastąpmy trochę bardziej prawdziwą terminologią.

sygnały

Po pierwsze z „sygnałem”, w rzeczywistości istnieje cała rodzina różnych sygnałów , które można wysłać do procesów uniksowych. Keep it simple istnieją 4, że będziesz często zobaczyć, SIGHUP, SIGTERM, SIGINT, i SIGKILL.

  • SIGHUP

    Sygnał SIGHUP jest wysyłany do procesu, gdy jego terminal sterujący jest zamknięty. Pierwotnie został zaprojektowany, aby powiadomić proces upuszczenia linii szeregowej. W nowoczesnych systemach sygnał ten zwykle oznacza, że ​​sterowanie pseudo lub wirtualnym terminalem zostało zamknięte.

  • SIGTERM

    Sygnał SIGTERM jest ogólnym sygnałem używanym do powodowania zakończenia programu. W przeciwieństwie do SIGKILL, sygnał ten może być blokowany, obsługiwany i ignorowany. Jest to normalny sposób grzecznego wezwania programu do zakończenia.

  • SIGINT

    Sygnał SIGINT („przerwanie programu”) jest wysyłany, gdy użytkownik wpisze znak INTR (zwykle Cc).

  • SIGKILL

    Sygnał SIGKILL służy do natychmiastowego zakończenia programu. Nie można go traktować ani ignorować, dlatego jest zawsze śmiertelny. Nie można również zablokować tego sygnału.

UWAGA: SIGINT jest wysyłany, gdy używasz Ctrl+, Caby „przerwać” program z linii poleceń, gdy jest on w trakcie działania.

który się przyzwyczaja?

Najprawdopodobniej SIGTERMjest wywoływane przez środowisko okienkowe i przekazywane do terminala. Twój terminal najprawdopodobniej wtedy wyśle SIGHUPdo MATLAB. Ten sygnał daje wszystkim procesom możliwość wykonania dowolnego lokalnego czyszczenia (zamykanie plików, kończenie procesów itp.).

polecenie zabicia

Można wysyłać sygnały samemu za pomocą słabo nazwie polecenia kill. Aby wysłać SIGTERMsygnał do terminala lub SIGHUP to MATLAB, you could determine their PID usingps`, a następnie uruchom polecenie, aby wysłać sygnał:

$ kill -SIGTERM <PID>

albo to:

$ kill -SIGHUP <PID>

Możesz uzyskać pełną listę sygnałów za pomocą tego polecenia:

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

Zauważ, że sygnały mają liczby? Często zobaczysz, że są używane w ten sposób zamiast ich nazw:

$ kill -15 <PID>

Lub niesławny -9, który może zabić prawie każdy proces.

slm
źródło
Zawsze myślałem, że te liczby są ujemne, ale w rzeczywistości są to argumenty wiersza poleceń. Nauczyłem się czegoś nowego: D
Thomas
1
HUP - HangUP - to sygnał wysyłany, jeśli „stracisz linię” terminala, np. Jesteś podłączony do serwera Unix przez modem. Jest to prawdopodobnie najbardziej „delikatny” sygnał, który kończy proces. Większość demonów nie chce wyjść, ale ponownie odczytuje swoje pliki konfiguracyjne na HUP. Polecenie nohup pozwala na kontynuowanie procesu w tle po zamknięciu powłoki. Polecenia takie jak screen przetrwają zawieszenie i izolują zawarte w nim polecenia z HUP.
Baard Kopperud
@BaardKopperud - dzięki, celowo zrezygnowałem z HUP, nie chciałem mylić dyskusji.
slm
@BaardKopperud - Myślę, że zwracasz uwagę na to: „Sygnał SIGHUP jest wysyłany do procesu, gdy jego terminal kontrolny jest zamknięty. Pierwotnie został zaprojektowany, aby powiadomić proces o zaniku linii szeregowej. W nowoczesnych systemach ten sygnał zwykle oznacza, że ​​kontrolowanie pseudo lub wirtualnego terminala zostało zamknięte. „Przyznaję, że trochę skłamałem w swoim opisie, ale starałem się to uprościć.
slm
@BaardKopperud - czułem się winny, więc zmodyfikowałem swoją odpowiedź, aby dokładniej odzwierciedlić, co się dzieje. Dzięki!
slm
2

Najprawdopodobniej jest to w porządku, ale stracisz dane w zależności od otwartych aplikacji. Na przykład, jeśli masz otwarty edytor plików, możesz stracić niektóre ze swoich zmian, jeśli nie zapiszesz i nie zamkniesz poprawnie. Jeśli się martwisz, po prostu wyloguj się / wyjdź z terminala poprawnie. Jeśli nie lubisz pisać exitlub logoutpo prostu spróbuj Ctrl-D.

znak
źródło
Dlaczego miałoby być lepiej? Aplikacja otrzyma SIGHUP zamiast SIGTERM, ale wciąż ginie od sygnału, więc nie nazwałbym go „zapisz i wyjdź poprawnie”
Michael Mrozek
O ile tak Ctrl-Dnaprawdę dotyczy to tylko wiersza polecenia.
Mark