Как bash обрабатывает задания при выходе из системы?
Насколько я понял из книг и справочников bash. Когда пользователь выходит из bash, все фоновые задания, которые запускаются пользователем, автоматически прекращаются, если он не использует nohup или отключен. Но сегодня я его протестировал:
- Зашел на мой рабочий стол gnome и получил доступ к gnome-терминалу.
-
В терминале есть две вкладки, а в одном я создал нового пользователя, который называется test и зарегистрирован как test
su - test
-
запущен script.
cat test.sh
#!/bin/bash
sleep 60
printf "hello world!!"
exit 0
./test.sh &
-
После этого я вышел из теста и закрыл вкладку
- На следующей вкладке я вывел ps aux как root и обнаружил, что задание все еще запущено.
Как это происходит?
Ответы
Ответ 1
Завершение работы фоновых заданий при выходе зависит от оболочки. Обычно Bash этого не делает, но может быть настроен для входа в систему (shopt -s huponexit
). В любом случае доступ к tty невозможен после завершения процесса управления (такого как оболочка входа в систему).
Ситуации, которые всегда вызывают SIGHUP
включают в себя:
- Что-нибудь на переднем плане, когда tty закрыт.
- Любое фоновое задание, которое включает остановленные процессы, когда завершается их оболочка (
SIGCONT
и SIGHUP
). Оболочки обычно предупреждают вас, прежде чем позволить этому произойти.
Резюме huponexit:
-
Вкл.: Фоновые задания будут прекращены с SIGHUP при выходе из оболочки
$ shopt -s huponexit
$ shopt huponexit
huponexit on
-
Off: Фоновые задания НЕ завершаются с SIGHUP при выходе из оболочки.
$ shopt -u huponexit
$ shopt huponexit
huponexit off
Ответ 2
Только интерактивные оболочки убивают задания, когда вы их закрываете. Другие оболочки (например, те, которые вы используете с помощью su - username
), не делают этого. И интерактивные оболочки только убивают прямые подпроцессы.