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


29

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

Я запускаю фоновый процесс, добавляя « &» в командную строку или останавливая его 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было отправлено вообще при выходе из системы.


Я не видел упоминаний о консольном вводе-выводе, что также может привести к путанице. Вы отвлекали вещи, например, 1>/dev/null 2>&1для bash и т. Д.
Эйвери Пэйн

Нет, я не Конечно, SCP не требовал стандартного ввода ... и стандартного вывода, похоже, не было проблемой.
Массимо

Будет ли ваша оболочка работать как оболочка входа в систему, это влияет на производительность, что может быть в данном случае.
Уорнер

Сделано несколько других тестов; Я подвел итог здесь: serverfault.com/questions/117152 .
Массимо

Ответы:


20

Ответ найден.

Для BASH это зависит от параметра huponexitоболочки, который можно просмотреть и / или установить с помощью встроенной shoptкоманды.

Похоже, эта опция отключена по умолчанию, по крайней мере, в системах на базе RedHat.

Больше информации на странице руководства BASH :

Оболочка выходит по умолчанию при получении SIGHUP. Перед выходом интерактивная оболочка отправляет SIGHUP всем работам, запущенным или остановленным. Остановленные задания отправляются SIGCONT, чтобы гарантировать получение SIGHUP. Чтобы предотвратить отправку оболочкой сигнала определенному заданию, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Ниже КОМАНДЫ СОСТАВЛЕНИЯ ОБОЛОЧКИ) или отметить, что она не получает SIGHUP с помощью команды disown -h.

Если параметр оболочки huponexit был установлен с помощью shopt, bash отправляет SIGHUP всем работам при выходе из интерактивной оболочки входа.


2
Это глупое значение по умолчанию, но мои смелости говорят мне, что это ошибка RH, а не bash. Кстати, с Zsh вы можете использовать &! как ярлык, чтобы отречься, и процессы разветвляются с & do get sighup.
Юрген Штробель

7

Я согласен с Warner и хочу добавить, что вы можете запретить оболочке отправлять SIGHUP с помощью встроенной команды «disown». Страница руководства bash содержит хорошее описание.


4

Вы можете использовать команду nohup для запуска команды и перенаправления вывода в выходной файл nohup. Со страницы руководства nohup:

nohup - run a command immune to hangups, with output to a non-tty

Другой вариант - использовать экранную команду. Преимущество использования экрана в том, что вы можете подключиться к процессу позже.


Почему отрицательные? Использование nohup и screen - вполне приемлемые способы избежать остановки процесса при выходе из системы. Есть и другие, но оба они работают. В чем дело?
Джим

2
Я думаю, что это отличный момент, но вопрос о том, почему его процессы не убиваются, а НЕ «как убить их».
CarpeNoctem

2

Когда вы преобразуете процесс в фоновый режим, он все равно будет дочерним процессом из исполняющей его оболочки.

Все дочерние процессы, работающие в оболочке, отправляются с SIGHUP при выходе. Производительность немного варьируется в зависимости от конкретной ситуации, которая подробно изложена на странице руководства bash. Другие оболочки, вероятно, имеют аналогичные описания.

Apache и другие демоны обычно перезагружают конфигурацию на SIGHUP. Утилиты пользовательского пространства часто умирают. Производительность приложения, связанная с сигналами, может быть уникальной для приложения.


Таким образом, процесс должен был просто получить SIGHUP в этом случае, верно? Может, просто проигнорировал, я проверю.
Массимо

Да, точно. Это то, что я считаю, ситуация. Если вы действительно сомневаетесь в документированной производительности, вы можете взломать небольшой скрипт, чтобы перехватить сигнал и записать его.
Уорнер

0

Каков был процесс? Работа, описанная в предыдущем посте 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, возможно, больше сигналов.


Этот пост действительно заставил меня задать вопрос. Подробнее см. Выше.
Массимо

2
Ответы в другой ветке звучат так, будто вам нужно прочитать команду SCP, которую вы используете, и посмотреть, как она реагирует на SIGHUP
mfinni

И nohup - для команд, которые, как вы знаете, умрут с SIGHUP, и вы не хотите их, я думаю.
mfinni

Страница руководства просто не говорит этого; Я постараюсь убить его -HUP завтра ...
Массимо

-1

Если вы не запустили команду с помощью инструмента, подобного screen, то когда сеанс завершится, сделайте все задания / задачи, связанные с этим сеансом.


Это именно то, о чем я думал, кроме ... они просто этого не сделали.
Массимо

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

-1 нет; Ответ не так прост. Я только что протестировал простой сценарий оболочки, который я начал в фоновом режиме; он зациклился и отправил вывод во временный файл. Он продолжал работать после того, как я вышел из терминала (как видно tail -fиз временного файла. Это на компьютере CentOS 7.1 с использованием bash.
Майк С

@MikeS - пожалуйста, продемонстрируйте. Я никогда не был свидетелем поведения, которое вы описываете
Уоррен

@warren - Смотрите мой ответ на serverfault.com/questions/117152/… . Обратите внимание, что многие люди утверждают, что поведение отличается от того, что вы описываете; действительно, Массимо написал именно потому, что его процесс продолжился.
Майк С
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.