Если я запустлю фоновый процесс, а затем выйду из системы, он продолжит работать?

Отвечая на этот вопрос после продолжительной дискуссии с коллегой, мне бы очень хотелось получить разъяснение.

Я запускаю фоновый процесс, либо добавляя&"в командной строке или остановив его с помощью 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затем, когда сеанс завершается, выполняются также все задания / задачи, связанные с этим сеансом.

Другие вопросы по тегам