Назад | Перейти на главную страницу

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

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

Я запускаю фоновый процесс, добавляя "&"в командную строку или остановив ее с помощью CTRL-Z и возобновить его в фоновом режиме с помощью "bg". Затем я выхожу из системы.

Что случается?

Мы были совершенно уверены, что он должен был быть уничтожен сигналом SIGHUP, но этого не произошло; после повторного входа в систему процесс успешно работал и pstree показал, что это было "принято" init.

Это ожидаемое поведение?

Но тогда, если это так, в чем nohup цель команды? Просто похоже, что процесс все равно не убьют, с ним или без ...


Редактировать 1

Еще немного подробностей:


Редактировать 2

Чтобы сформулировать вопрос более четко: поместит процесс в фоновый режим (используя & или bg) заставить его игнорировать SIGHUP, как и nohup команда делает?


Редактировать 3

Я попытался вручную отправить SIGHUP к scp: он вышел, поэтому определенно не игнорирует сигнал.

Затем я попытался снова запустить его, поместить в фоновый режим и выйти из системы: он был "принят" init и продолжал работать, и я нашел его там, когда снова зашел в систему.

Я сейчас очень озадачен. Похоже нет SIGHUP был отправлен вообще при выходе из системы.

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

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

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

Подробнее о Страница руководства BASH:

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

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

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

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

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

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

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

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

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

Каков был процесс? Производительность, описанная в более ранней публикации1 был точным.

Некоторые функции и процессы сценария могут перехватывать сигналы. а петли могут разбегаться как сумасшедшие.

Видеть:

Сеанс SSH прерывается - команда продолжает выполняться?

Редактировать 1 в 16: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, затем, когда сеанс завершится, сделают все задания / задачи, связанные с этим сеансом.