Отвечая на этот вопрос после продолжительной дискуссии с коллегой, мне бы очень хотелось получить разъяснение.
Я запускаю фоновый процесс, добавляя « &
» в командную строку или останавливая его 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 и т. Д.Ответы:
Ответ найден.
Для BASH это зависит от параметра
huponexit
оболочки, который можно просмотреть и / или установить с помощью встроеннойshopt
команды.Похоже, эта опция отключена по умолчанию, по крайней мере, в системах на базе RedHat.
Больше информации на странице руководства BASH :
источник
Я согласен с Warner и хочу добавить, что вы можете запретить оболочке отправлять SIGHUP с помощью встроенной команды «disown». Страница руководства bash содержит хорошее описание.
источник
Вы можете использовать команду nohup для запуска команды и перенаправления вывода в выходной файл nohup. Со страницы руководства nohup:
Другой вариант - использовать экранную команду. Преимущество использования экрана в том, что вы можете подключиться к процессу позже.
источник
Когда вы преобразуете процесс в фоновый режим, он все равно будет дочерним процессом из исполняющей его оболочки.
Все дочерние процессы, работающие в оболочке, отправляются с SIGHUP при выходе. Производительность немного варьируется в зависимости от конкретной ситуации, которая подробно изложена на странице руководства bash. Другие оболочки, вероятно, имеют аналогичные описания.
Apache и другие демоны обычно перезагружают конфигурацию на SIGHUP. Утилиты пользовательского пространства часто умирают. Производительность приложения, связанная с сигналами, может быть уникальной для приложения.
источник
Каков был процесс? Работа, описанная в предыдущем посте 1, была точной.
Определенные функции и процессы сценария могут перехватывать сигналы. в то время как петли могут убегать как сумасшедшие.
Видеть:
Сеанс SSH прекращается - команда продолжает выполняться?
Изменить 1 в 4:22 вечера
Из справочной страницы bash:
Первоначальное исследование 1 показывает, что OpenSSH, вероятно, игнорирует SIGHUP, возможно, больше сигналов.
источник
Если вы не запустили команду с помощью инструмента, подобного
screen
, то когда сеанс завершится, сделайте все задания / задачи, связанные с этим сеансом.источник
tail -f
из временного файла. Это на компьютере CentOS 7.1 с использованием bash.