Предположим, что вы открыли терминал в Linux и запустили в нем какую-нибудь программу. Если вы закроете окно терминала, тогда программа, которую вы запустили, тоже закроется.
Чтобы закрыть терминал, но при этом оставить работать запущенную из него программу, перейдите в терминал и нажмите сочетание клавиш Ctrl+Z (это позволит вам получить доступ к командой строке). Затем наберите в терминале следующие команды:
disown -h %1
bg 1
Команда disown с ключом -h используется для того, чтобы пометить процесс с номером 1 (это наша запущенная программа) не закрываться при закрытии терминала (на нее не подействует сигнал SIGHUP), а команда bg переводит задачу в фоновый режим. Теперь вы можете спокойно закрыть терминал (кликнуть на крестик или ввести команду exit).
Есть еще один способ, при котором окно терминала закроется сразу после запуска какой-нибудь команды. Для этого нужно добавить к команде & exit. Например, следующая команда запустит редактор GEdit и тут же закроет терминал:
gedit & exit
Комментарии
01:39
Это позволит нам отследить ошибки, если они вдруг возникли или проконтролировать, что работа программы была завершена корректно, как в случае с фоновой загрузкой файла, например.
nohup <наша фоновая программа> &
При таком использовании весь стандартный вывод программы идет в файл nohup.out (по умолчанию, можно переопределить ключом -O), а терминал освобождается и может быть закрыт. Причем вывод идет и при закрытом терминале или отсоединенной сессии, в случае с доступом по ssh (основной вариант использования в моем случае).
10:39
setsid создаёт для запускаемой через неё программы отдельную сессию, изначально отсоединённую от текущей консоли TTY, а значит не получающую от неё никаких сигналов. В простейшем случае:
setsid программа
или, если требуется сразу отключить стандартный ввод-вывод, можно сделать такой скрипт:
#!/bin/sh
setsid "$@" &> /dev/null < /dev/null &
Положить его, скажем, в /usr/local/bin/run и запускать
run программа параметры
05:12
Процесс с номером 1 это всегда init :) , в данном случае это _номер_задачи_ относящейся к данному контролирующему терминалу. Для поиска задач используется команда jobs. Если мы имеем только одну задачу, то указывать %1 не обязательно, можно просто fg или bg (для перевода в приоритетный или фоновый режим). Также можно указывать имя %edit или часть имени %?edi
Кроме этого, не каждый интерпретатор посылает сигнал SIGHUP при закрытии терминала, но bash посылает :)
Про nohup, setsid согласен.
05:33
20:16
08:42
kill -SIGCONT pid
14:32