Закрываем окно терминала без закрытия открытой программы. Linux статьи

Закрываем окно терминала без закрытия открытой программы

7

Предположим, что вы открыли терминал в Linux и запустили в нем какую-нибудь программу. Если вы закроете окно терминала, тогда программа, которую вы запустили, тоже закроется.


style="display:block"
data-ad-client="ca-pub-2524362972367757"
data-ad-slot="3629500545"
data-ad-format="auto"
data-full-width-responsive="true">

Чтобы закрыть терминал, но при этом оставить работать запущенную из него программу, перейдите в терминал и нажмите сочетание клавиш Ctrl+Z (это позволит вам получить доступ к командой строке). Затем наберите в терминале следующие команды:

disown -h %1  
bg 1

Команда disown с ключом -h используется для того, чтобы пометить процесс с номером 1 (это наша запущенная программа) не закрываться при закрытии терминала (на нее не подействует сигнал SIGHUP), а команда bg переводит задачу в фоновый режим. Теперь вы можете спокойно закрыть терминал (кликнуть на крестик или ввести команду exit).
Команды disown и bg

Есть еще один способ, при котором окно терминала закроется сразу после запуска какой-нибудь команды. Для этого нужно добавить к команде & exit. Например, следующая команда запустит редактор GEdit и тут же закроет терминал:

gedit & exit
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
7

Комментарии

Alizeo
22.06.2012, 01:39
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
Более корректный вариант: использование nohup.

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

nohup <наша фоновая программа> &

При таком использовании весь стандартный вывод программы идет в файл nohup.out (по умолчанию, можно переопределить ключом -O), а терминал освобождается и может быть закрыт. Причем вывод идет и при закрытом терминале или отсоединенной сессии, в случае с доступом по ssh (основной вариант использования в моем случае).
Natrio
23.06.2012, 10:39
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
Гораздо правильнее (и надёжнее) будет использовать не nohup, а setsid, поскольку многие программы могут закрываться НЕ ТОЛЬКО по сигналу HUP.
setsid создаёт для запускаемой через неё программы отдельную сессию, изначально отсоединённую от текущей консоли TTY, а значит не получающую от неё никаких сигналов. В простейшем случае:

setsid программа

или, если требуется сразу отключить стандартный ввод-вывод, можно сделать такой скрипт:

#!/bin/sh
setsid &quot;$@&quot; &amp;&gt; /dev/null &lt; /dev/null &amp;

Положить его, скажем, в /usr/local/bin/run и запускать

run программа параметры
Nor
26.06.2012, 05:12
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
" Команда disown с ключом -h используется для того, чтобы пометить процесс с номером 1

Процесс с номером 1 это всегда init :) , в данном случае это _номер_задачи_ относящейся к данному контролирующему терминалу. Для поиска задач используется команда jobs. Если мы имеем только одну задачу, то указывать %1 не обязательно, можно просто fg или bg (для перевода в приоритетный или фоновый режим). Также можно указывать имя %edit или часть имени %?edi

Кроме этого, не каждый интерпретатор посылает сигнал SIGHUP при закрытии терминала, но bash посылает :)

Про nohup, setsid согласен.
Nor
26.06.2012, 05:33
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
И да, не сочтите за доковырку, то что на рисунке это _эмулятор_ терминала :) в настоящий терминал можно попасть по Ctrl-Alt-F[x] (на F7 иксы).
Ян
30.03.2017, 20:16
Постоянная ссылка на комментарийРодительский комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
Но ведь это же тоже не настоящий терминал. Настоящий терминал это ящик с монитором и клавиатурой, какие использовались этак наверное в семидесятых годах и стоили немеряную кучу бабла. Которые связывались с основным компьютером (сервером) посредством вот этого самого протокола системы ANSI. VT100, например. Вот это точно не эмуляция, лол.
[аноним]
30.05.2015, 08:42
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
Ctrl+Z
kill -SIGCONT pid
Антон
22.09.2016, 14:32
Постоянная ссылка на комментарий
Войдите, чтобы ставить лайкимне нравится
Лайков: 0
войдите, чтобы ставить лайки
Господи! Самый нормальный вариант как раз "gedit & exit" - перезапустить апплет, например, зависшего вайфая и т.п. У меня вот так было, что апплет завис, сети нет. Пришлось сперва убить NetworkManager, его апплет, а потом перезапустить его самого (просто команда sudo NetworkManager) и его аппелт nm-applet & exit - чтобы терминал закрылся, а апплет остался.

Написать комментарий

Ваше имя:
Текст комментария: