
Это больше вопрос управления процессами/обработки сигналов, чем вопрос Bash. Он просто использует Bash для объяснения проблемы.
Я запускаю скрипт Bash, в котором я запускаю фоновый процесс. Вот скрипт:
#!/bin/bash
# ...
# The background process
{
while :; do
sleep 1 && echo foo >> /path/to/some/file.txt
done
} &
# ...
exit 0
Я НЕ запускаю сам скрипт в фоновом режиме. Просто ./script
.
Опция оболочки "huponexit" включается с помощью shopt -s huponexit
, поэтому при закрытии терминала я ожидаю, что он отправит сигнал HUP в Bash, который будет распространять его, пока не достигнет фонового процесса. Если фоновый процесс не trap
проигнорирует сигнал, он тоже будет убит, но этого не происходит. Фоновый процесс действует так, как будто он был disown
'ed.
Это схема, которую я нарисовал, чтобы проиллюстрировать проблему. Схема, как и описание выше, может быть неверной, поскольку я уверен, что недостаточно хорошо понимаю предмет. Пожалуйста, исправьте меня, если это действительно так.
Я хочу узнать, почему фоновый процесс не завершается после закрытия терминала, как будто он был вызван интерактивной оболочкой вроде этой:
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
Я не уверен, но предполагаю, что ответ на мой вопрос кроется в том, что Bash fork() — неинтерактивная оболочка для запуска скрипта, которая может иметь другой набор правил для управления заданиями и обработки сигналов.
решение1
Так о чем же нам говорит страница руководства huponexit
?
Если опция оболочки huponexit была установлена с помощью shopt, bash отправляет SIGHUP всем заданиям, когдаинтерактивный входоболочка выходит.
EDIT: Подчеркиваю, что это оболочка ВХОДА.
EDIT 2: интерактивность заслуживает равного внимания