Чи шкідливо закрити вікно терміналу без належного виходу з програми?


18

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

matlab -nodisplay -nodesktop -nosplash

а потім запустіть купу сценаріїв. Тоді я можу або

exit

завершити MATLAB, а потім закрити вікно терміналу або просто закрити вікно терміналу. У чому насправді різниця між цими двома методами? Чи другий метод якось «шкодить»? Чи є кращим перший метод? Чому?

Відповіді:


22

Взагалі це має бути добре, щоб зробити це так.

Коли ви натискаєте кнопку "X", щоб закрити вікно терміналу, він надсилає "сигнал" зі свого робочого столу (GNOME, KDE тощо) до програми терміналу, кажучи йому закритись. Оскільки ви використовуєте MATLAB в цій оболонці, він вважається дочірнім процесом до термінальної програми.

Отже, частина обов'язків того, щоб бути батьківським процесом, полягає в тому, що ви в свою чергу надсилаєте цей самий близький "сигнал" своїм дітям.

Тепер, якщо ви розумієте концептуально те, що я щойно пояснив, тоді давайте замінимо трохи більше реальної термінології.

сигнали

По-перше, з "сигналом" насправді існує ціла сім'я різних сигналів, які ви можете відправляти в процеси Unix. Для того, щоб тримати його просто є 4 , що ви часто будете бачити, SIGHUP, SIGTERM, SIGINT, і SIGKILL.

  • ЗАРАЗ

    Сигнал SIGHUP надсилається процесу, коли його керуючий термінал закритий. Спочатку він був розроблений для повідомлення про падіння послідовної лінії. У сучасних системах цей сигнал зазвичай означає, що керування псевдо або віртуальним терміналом було закрито.

  • SIGTERM

    Сигнал SIGTERM - це загальний сигнал, який використовується для викликання завершення програми. На відміну від SIGKILL, цей сигнал можна блокувати, обробляти та ігнорувати. Це звичайний спосіб ввічливо попросити програму припинити.

  • SIGINT

    Сигнал SIGINT ("переривання програми") надсилається, коли користувач вводить символ INTR (зазвичай Cc).

  • SIGKILL

    Сигнал SIGKILL використовується для негайного припинення програми. З нею не можна впоратися чи ігнорувати, і тому завжди є смертельним. Також неможливо заблокувати цей сигнал.

ПРИМІТКА: SIGINT це те, що надсилається, коли ви використовуєте Ctrl+ Cдля "перелому" програми з командного рядка, поки вона знаходиться в середині запуску.

до якого звикаєш?

Швидше за все, SIGTERMце викликає ваше середовище вікна та передається до вашого терміналу. Тоді ваш термінал, швидше за все, потім надсилається SIGHUPв MATLAB. Цей сигнал дає всім процесам можливість зробити будь-яке місцеве очищення (закриття файлів, закінчення процесів тощо) самостійно.

команда kill

Ви можете посилати сигнали самостійно , використовуючи погано з ім'ям команди 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 дозволяє дозволити продовження фонового процесу після закриття оболонки. Такі команди, як екран, переживають вивільнення та ізолюють команди в ньому від HUP.
Баард Копперуд

@BaardKopperud - дякую, я навмисно залишив HUP, не хотів плутати дискусію.
slm

@BaardKopperud - я думаю, що ви на це вказуєте: "Сигнал SIGHUP надсилається до процесу, коли його керуючий термінал закритий. Спочатку він був розроблений для повідомлення про падіння послідовної лінії. У сучасних системах цей сигнал зазвичай означає, що керування псевдо або віртуальним терміналом було закрито "Я визнаю, що я трохи брехав у своєму описі, але намагався зробити це просто.
slm

@BaardKopperud - я відчув свою провину, тому змінив свою відповідь, щоб більш точно відобразити те, що відбувається. Спасибі!
slm

2

Це, швидше за все, нормально, але ви втратите дані залежно від того, які програми ви відкрили. Наприклад, якщо у вас відкритий редактор файлів, ви можете втратити деякі зміни, якщо не зберегти та вийти належним чином. Якщо ви переживаєте, просто вийдіть із терміналу та вийдіть належним чином. Якщо вам не подобається вводити текст exitабо logoutпросто спробувати Ctrl-D.


Чому це було б краще? Додаток отримає SIGHUP замість SIGTERM, але його все одно вбивають сигналом, тому я б точно не називав це "зберегти та вийти належним чином"
Michael Mrozek

Наскільки Ctrl-Dце дійсно стосується лише командного рядка.
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.