Если я запустлю фоновый процесс, а затем выйду из системы, он продолжит работать?
Отвечая на этот вопрос после продолжительной дискуссии с коллегой, мне бы очень хотелось получить разъяснение.
Я запускаю фоновый процесс, либо добавляя&
"в командной строке или остановив его с помощью CTRL-Z
и возобновить его в фоновом режиме с "bg
". Тогда я выхожу.
Что просходит?
Мы были совершенно уверены, что он должен был быть убит SIGHUP, но этого не произошло; после входа в систему, процесс был успешно запущен и pstree
показал, что это было "принято" init
,
Это ожидаемое поведение?
Но тогда, если это так, что nohup
цель команды? Похоже, что процесс все равно не будет убит, с ним или без него...
Редактировать 1
Еще несколько деталей:
- Команда была запущена из сеанса SSH, а не из физической консоли.
- Команда была запущена без
nohup
и / или&
; затем был приостановлен сCTRL-Z
и возобновил в фоновом режиме сbg
, - Сеанс ssh не сбрасывался. Был фактический выход ("
exit
"команда). - Процесс был
scp
операция копирования файла. - При входе снова,
pstree
показал процесс запущен и будучи потомкомinit
,
Редактировать 2
Чтобы сформулировать вопрос более четко: будет ли процесс в фоновом режиме (используя &
или же bg
) сделать это игнорировать SIGHUP
так же, как nohup
команда делает?
Редактировать 3
Я пытался вручную отправить SIGHUP
в scp
: он вышел, поэтому он определенно не игнорирует сигнал.
Затем я попытался снова запустить его, поставить его в фоновом режиме и выйти из системы: он был "принят" init
и продолжал работать, и я нашел его там при входе в систему.
Я сейчас озадачен. Выглядит как нет SIGHUP
был отправлен на все upong выходя из.
7 ответов
Ответ найден.
Для BASH это зависит от huponexit
опция оболочки, которую можно просматривать и / или устанавливать с помощью встроенного shopt
команда.
Похоже, эта опция отключена по умолчанию, по крайней мере, в системах на базе RedHat.
Больше информации на странице руководства BASH:
Оболочка выходит по умолчанию при получении SIGHUP. Перед выходом интерактивная оболочка отправляет SIGHUP всем работам, запущенным или остановленным. Остановленные задания отправляются SIGCONT, чтобы гарантировать получение SIGHUP. Чтобы предотвратить отправку оболочкой сигнала определенному заданию, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Ниже КОМАНДЫ СОСТАВЛЕНИЯ ОБОЛОЧКИ) или отметить, что она не получает SIGHUP с помощью команды disown -h.
Если параметр оболочки huponexit был установлен с помощью shopt, bash отправляет SIGHUP всем работам при выходе из интерактивной оболочки входа.
Я согласен с Warner и хочу добавить, что вы можете запретить оболочке отправлять SIGHUP с помощью встроенной команды "disown". Страница руководства bash содержит хорошее описание.
Вы можете использовать команду nohup для запуска команды и перенаправления вывода в выходной файл nohup. Со страницы руководства nohup:
nohup - run a command immune to hangups, with output to a non-tty
Другой вариант - использовать экранную команду. Преимущество использования экрана в том, что вы можете подключиться к процессу позже.
Когда вы преобразуете процесс в фоновый режим, он все равно будет дочерним процессом из исполняющей его оболочки.
Все дочерние процессы, работающие в оболочке, отправляются с SIGHUP при выходе. Производительность немного варьируется в зависимости от конкретной ситуации, которая подробно изложена на странице руководства bash. Другие оболочки, вероятно, имеют аналогичные описания.
Apache и другие демоны обычно перезагружают конфигурацию на SIGHUP. Пользовательские утилиты часто умирают. Производительность приложения, связанная с сигналами, может быть уникальной для приложения.
Если вы выйдете из системы (Ctrl-Dилиexit
), он продолжит работать. Но если вы закроете окно терминала , фоновые процессы получат. Они также получатSIGHUP
вы теряете соединение с сервером. То же самое касается и локальной оболочки (за исключением того, что вы не можете потерять соединение с локальной оболочкой).
Каков был процесс? Работа, описанная в предыдущем посте 1, была точной.
Определенные функции и процессы сценария могут перехватывать сигналы. в то время как петли могут убегать как сумасшедшие.
Увидеть:
Сеанс SSH прекращается - команда продолжает выполняться?
Изменить 1 в 4:22 вечера
Из справочной страницы bash:
The shell exits by default upon receipt of a SIGHUP. Before exiting,
an interactive shell resends the SIGHUP to all jobs, running or
topped.
Первоначальное исследование 1 показывает, что OpenSSH, вероятно, игнорирует SIGHUP, возможно, больше сигналов.
Если вы не запустили команду с помощью такого инструмента, как screen
затем, когда сеанс завершается, выполняются также все задания / задачи, связанные с этим сеансом.