Как Bash обрабатывает задания при выходе из системы? - PullRequest
17 голосов
/ 28 ноября 2010

Насколько я понял из книг и руководств по bash, так оно и есть. Когда пользователь выходит из bash, все фоновые задания, запускаемые пользователем, автоматически завершаются, если он не использует nohup или disown. Но сегодня я проверил это:

  1. Войдите в систему на моем рабочем столе gnome и получите доступ к gnome-терминалу.
  2. В терминале есть две вкладки, и в одной я создал нового пользователя с именем test и вошел в систему как test

    su - test
    
  3. запустил скрипт.

    cat test.sh
    #!/bin/bash
    sleep 60
    printf "hello world!!"
    exit 0
    
    
    ./test.sh &
    
  4. После этого я вышел из теста и закрыл вкладку

  5. На следующей вкладке я выбрал ps aux в качестве пользователя root и обнаружил, что задание все еще выполняется.

Как это происходит?

Ответы [ 2 ]

13 голосов
/ 01 декабря 2010

Завершение выполнения фоновых заданий при выходе зависит от оболочки.Обычно Bash этого не делает, но может быть настроен для входа в систему (shopt -s huponexit).В любом случае доступ к tty невозможен после завершения процесса управления (например, оболочки входа в систему).

Ситуации, которые всегда вызывают SIGHUP, включают:

  • Все, что угоднона переднем плане, когда tty закрыт.
  • Любое фоновое задание, которое включает остановленные процессы, когда завершается их оболочка (SIGCONT и SIGHUP).Оболочки обычно предупреждают вас, прежде чем позволить этому произойти.

Сводка huponexit:

  • Вкл : Фоновые задания будут прерваны с SIGHUP, когда оболочкаexits

    $ shopt -s huponexit
    $ shopt huponexit
    huponexit       on
    
  • Off : фоновые задания НЕ завершаются с SIGHUP при выходе из оболочки.

    $ shopt -u huponexit
    $ shopt huponexit
    huponexit       off
    
2 голосов
/ 28 ноября 2010

Только интерактивные оболочки убивают задания, когда вы их закрываете.Другие оболочки (например, те, которые вы получаете с помощью su - username) этого не делают.А интерактивные оболочки убивают только прямые подпроцессы.

...