Я знаю, что могу добавить &
команду для запуска процесса в фоновом режиме.
Я работаю по SSH в Ubuntu 12.04 и запускаю программу на Python с $python program.py &
- но когда я иду, чтобы закрыть окно терминала, я получаю сообщение о том, что закрытие терминала убьет запущенный процесс.
Почему это? Я использую амперсанд для запуска процесса в фоновом режиме. Как я могу заставить его работать независимо от того, включен ли я в SSH?
Ответы:
Когда вы закрываете окно терминала, эмулятор терминала отправляет сигнал SIGHUP процессу, который он выполняет, вашей оболочке. Ваша оболочка затем пересылает этот SIGHUP на все, что работает. В вашей локальной системе это ssh. Затем ssh пересылает сигнал SIGHUP на удаленную оболочку. Таким образом, ваша удаленная оболочка затем отправляет SIGHUP всем своим процессам, вашей фоновой программе.
Есть 2 способа обойти это.
disown
команду после прохождения фонового процесса. Это заставит оболочку забыть об этом.nohup
(nohup $python program.py &
). Это выполняет то же самое, но с использованием промежуточного процесса. По сути, он игнорирует сигнал SIGHUP, а затем разветвляет и выполняет вашу программу, которая наследует настройки, а затем завершает работу. Поскольку она разветвлена, запускаемая программа не является дочерней для оболочки, и оболочка не знает об этом. И если он не устанавливает обработчик сигнала для SIGHUP, он все равно сохраняет действие игнорирования.logout
вместо закрытия окна терминала. Когда вы используетеlogout
, это не SIGHUP, и поэтому оболочка не отправит SIGHUP никому из своих дочерних элементов.Кроме того, вы должны убедиться, что ваша программа не выполняет запись в терминал через STDOUT или STDERR, так как оба из них больше не будут существовать после выхода из терминала. Если вы не перенаправите их на что-то подобное
/dev/null
, программа все равно будет работать, но если она попытается записать их, она получит SIGPIPE, а действие SIGPIPE по умолчанию - уничтожить процесс).источник
ssh
умирание вызывает разрыв соединения, а разрыв соединения -sshd
на другом конце. Тот sshd, который управляет главной стороной псевдотерминала, на котором работает удаленная оболочка, когда он умирает, является зависанием (это похоже на отключение от реального терминала), поэтому система отправляет сигнал SIGHUP на удаленную оболочку.nohup
генерируетсяnohup.out
файл с выводом программы, с которой вы начинаете. Может быть раздражает удаление этого файла каждый раз, когда вы используете nohup для запуска приложения таким способом (или вам нужно перенаправить его вывод в/dev/null
).nohup python program.py &
я рекомендовал использоватьsetsid python program.py
вместо этого, который сразу же отказывается от программы.Процесс работает в фоновом режиме в терминале, но вывод из
stdout
(иstderr
) все еще отправляется в терминал. Чтобы остановить это, добавьте> /dev/null 2>&1
перед&
перенаправлением обоих выходов/dev/null
- добавлениеdisown
также гарантирует, что процесс не будет завершен после закрытия терминала:В вашем случае это будет:
источник
Эти
&
команды оператора Разделяет работать параллельно, так же , как;
Разделяет команды для запуска последовательно. Оба вида команд будут по-прежнему выполняться как дочерние элементы процесса оболочки .Таким образом, когда вы закроете оболочку, которая запустила этих детей, дети тоже закроются.
Похоже, что вам нужен демон-процесс , который значительно сложнее, потому что он должен полностью отделиться от родительского процесса. Оболочка обычно не имеет простого способа сделать это.
источник
Когда вы выходите из системы, фоновые процессы, связанные с сеансом входа в систему, также обычно уничтожаются. Если вы хотите, чтобы они были отключены от сеанса, запустите их с помощью
nohup
.источник
После окончания команды ampersand (
&
) в командной строке выполните командуbg
:Это поместит команду "&" в фоновый режим.
Это перечислит задания, работающие в фоновом режиме
Это выведет задание № 1 на первый план
Другой способ (чтобы выйти из системы)
Команде можно отправить несколько строк
at
, прежде чемсм
man at
. ^ D (Control-D) .источник