Як закрити термінал без вбивства запущеної в ньому команди

Іноді потрібно «відв'язати» програма від вікна терміналу, в якому вона запущена. Наприклад, ви підключилися до віддаленого сервера по SSH, запустили завдання, яка не є демоном, але виконання якої вимагає великого часу (може бути дні і місяці). Якщо ви закриєте термінал або просто обірветься SSH сесію, то запущена програма просто припинить свою роботу.

Ще один приклад ситуації, коли це може знадобитися, ви працюєте з безголовим сервером (без графічного оточення робочого столу) і з цієї причини не можете відкрити кілька термінальних вікон. Тому ви хочете перевести програму в фон, щоб продовжити роботу з терміналом.

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

Для цього є два рішення:

Давайте розберемося, а в чому відмінності між

Давайте для початку поглянемо, що відбувається, коли команда запускається з інтерактивною оболонки (підключеної до терміналу) без (І без будь-якого перенаправлення). Тому давайте припустимо, що ви надрукували просто foo (як приклад команди), тоді:

  • Створюється процес foo.
  • Процес успадковує stdin (стандартний ввід), stdout (стандартний висновок), і stderr (стандартний висновок помилок) з оболонки. Отже, він також підключений до того ж терміналу.
  • Якщо оболонка отримує SIGHUP (сигнал, що посилається процесу для повідомлення про втрату з'єднання з керуючим терміналом користувача), вона також відправляє SIGHUP процесу (що зазвичай призводить до завершення процесу).
  • В іншому випадку оболонка очікує (є заблокованою) поки процес завершитися.

Тепер давайте подивимося, що відбувається, коли ми переводимо процес в фон, це робиться набором foo .

Тепер disown видаляє завдання зі списку завдань оболонки, отже всі наведені вище підпункти більше не застосовуються (включаючи відправку оболонкою процесу сигналу SIGHUPl). Проте, пам'ятайте, що він все ще підключений до терміналу, тому якщо термінал зруйнований (що може трапитися якщо це був pty, як ті, які створюються xtermor або ssh. І контролююча програма завершена закриттям xterm або закриттям SSH -підключення), програма зазнає невдачі, як тільки вона шанується прочитати зі стандартного вводу або записати в стандартний висновок.

Що Оделана nohup. з одного боку, вона активно відокремлює процес від терміналу:

Пам'ятайте, що nohup не видаляти процес з контролю завдань оболонки і також не переводить його в фон (але оскільки завдання nohup на передньому плані практично марно, то зазвичай вона запускається з використанням ). Наприклад, на відміну від disown. оболонка все ще буде говорить вам, коли завдання nohup завершена (звичайно, якщо оболонка не закрилася раніше цього).

Якщо використовувати разом всі три disown. nohup і . то процес буде запущений у фоновому режимі, що знаходиться на відстані з контролю завдань оболонки і ефективно відключений від терміналу.

nohup виконує КОМАНДУ ігноруючи сигнали обриву термінальної лінії.

Можливі опції nohup:

Якщо стандартне введення є терміналом, то він береться з нечитабельною файлу.

Якщо стандартний висновок є терміналом, то висновок додається в «nohup.out», якщо можливо, інакше в «$ HOME / nohup.out».

Якщо стандартний потік помилок є терміналом, то він перенаправляє в стандартний висновок. Щоб записати висновок в ФАЙЛ, використовуйте «nohup КОМАНДА> Фото».

ЗАУВАЖЕННЯ: ваша оболонка може надавати свою версію nohup. яка зазвичай перекриває версію, описану тут. Будь ласка, звертайтеся до документації по вашій оболонці, щоб дізнатися, які ключі вона підтримує.

Замітка ґрунтується на джерелах:

Поділитися "Як закрити термінал без вбивства запущеної в ньому команди"