Вредно ли закрывать окно терминала без правильного выхода из приложения?


18

Используя Ubuntu 12.04 LTS, мой вопрос заключается в том, что если я запустил приложение в окне терминала, то есть ли что-то плохое в простом закрытии окна терминала без надлежащего выхода из приложения. Например, я использую MATLAB. Я открываю терминал и набираю

matlab -nodisplay -nodesktop -nosplash

а затем запустить кучу скриптов. Тогда я могу либо

exit

завершить MATLAB и затем закрыть окно терминала или просто закрыть окно терминала. В чем разница между этими двумя методами? Второй способ чем-то "навредит"? Первый метод предпочтительнее? Почему?

Ответы:


22

В целом это должно быть хорошо, чтобы сделать это таким образом.

Когда вы нажимаете «X», чтобы закрыть окно терминала, это означает, что он посылает «сигнал» с вашего рабочего стола (GNOME, KDE и т. Д.) В приложение терминала, сообщая ему, что он должен выключиться. Поскольку вы запускаете MATLAB в этой оболочке, он считается дочерним процессом для терминального приложения.

Таким образом, часть обязанностей быть родительским процессом заключается в том, что вы, в свою очередь, посылаете тот же самый «сигнал» своим детям.

Теперь, если вы понимаете концептуально то, что я только что объяснил, давайте заменим немного больше реальной терминологией.

сигналы

Во-первых, с помощью «сигнала» существует целое семейство различных сигналов, которые вы можете отправлять процессам Unix. Для того, чтобы держать его просто есть 4 , что вы часто будете видеть, SIGHUP, SIGTERM, SIGINT, и SIGKILL.

  • SIGHUP

    Сигнал SIGHUP отправляется процессу, когда его управляющий терминал закрыт. Первоначально он был разработан, чтобы уведомить процесс сброса последовательной линии. В современных системах этот сигнал обычно означает, что управление псевдо или виртуальным терминалом было закрыто.

  • SIGTERM

    Сигнал SIGTERM - это общий сигнал, используемый для завершения программы. В отличие от SIGKILL, этот сигнал может быть заблокирован, обработан и проигнорирован. Это нормальный способ вежливо попросить программу прекратить работу.

  • SIGINT

    Сигнал SIGINT («программное прерывание») отправляется, когда пользователь вводит символ INTR (обычно Cc).

  • SIGKILL

    Сигнал SIGKILL используется для немедленного завершения программы. Это не может быть обработано или проигнорировано, и поэтому всегда смертельно. Также невозможно заблокировать этот сигнал.

ПРИМЕЧАНИЕ: SIGINT это то, что отправляется, когда вы используете « Ctrl+», Cчтобы «вырвать» программу из командной строки, когда она находится в середине выполнения.

какой привык?

Скорее всего, он SIGTERMвызывается вашей оконной средой и передается на ваш терминал. Ваш терминал, скорее всего, затем отправляет SIGHUPв MATLAB. Этот сигнал дает всем процессам возможность выполнять любую локальную очистку (закрытие файлов, завершение процессов и т. Д.) Самостоятельно.

убить команду

Вы можете отправлять сигналы самостоятельно, используя плохо названную команду kill. Таким образом, чтобы отправить SIGTERMсигнал на ваш терминал или в SIGHUP to MATLAB, you could determine their PID usingps`, а затем выполните эту команду, чтобы отправить им сигнал:

$ kill -SIGTERM <PID>

или это:

$ kill -SIGHUP <PID>

Вы можете получить полный список сигналов, используя эту команду:

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

Обратите внимание, что сигналы имеют номера? Вы часто будете видеть их такими, а не по именам:

$ kill -15 <PID>

Или печально известный -9, который может убить практически любой процесс.


Я всегда думал, что эти числа были отрицательными, но на самом деле они являются аргументами командной строки. Я узнал что-то новое: D
Томас

1
HUP - HangUP - это сигнал, который отправляется, если вы «теряете линию» для терминала, например, вы были подключены к Unix-серверу через модем. Это, вероятно, самый «нежный» сигнал, который завершает процесс. Большинство демонов не выходят, а перечитывают свои конфигурационные файлы на HUP. Команда nohup позволяет вам продолжить фоновый процесс после закрытия оболочки. Команды, такие как screen, переживают зависание и изолируют команды в нем от HUP.
Баард Копперуд

@BaardKopperud - спасибо, я намеренно оставил HUP, не хотел путать обсуждение.
SLM

@BaardKopperud - я думаю, что вы указываете на это: «Сигнал SIGHUP отправляется процессу, когда его управляющий терминал закрыт. Первоначально он был разработан, чтобы уведомить процесс о сбое последовательной линии. В современных системах этот сигнал обычно означает, что управление псевдо или виртуальным терминалом было закрыто "Я признаю, что немного соврал в своем описании, но пытался сделать его простым.
SLM

@BaardKopperud - я чувствовал себя виноватым, поэтому я изменил свой ответ, чтобы более точно отразить происходящее. Благодарность!
SLM

2

Скорее всего, все в порядке, но вы потеряете данные в зависимости от того, какие приложения у вас открыты. Например, если у вас открыт редактор файлов, вы можете потерять некоторые изменения, если не сохраните их и не выйдете должным образом. Если вы беспокоитесь, просто выйдите из системы / выйдите из терминала правильно. Если вам не нравится печатать exitили logoutпросто попробуйте Ctrl-D.


Почему это было бы лучше? Приложение получит SIGHUP вместо SIGTERM, но оно все равно будет убито сигналом, поэтому я бы точно не назвал это «сохранить и выйти правильно»
Майкл Мрозек

Насколько Ctrl-Dэто действительно применимо только в командной строке.
Марк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.