Как 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), не делают этого. И интерактивные оболочки только убивают прямые подпроцессы.