2010-11-28 13 views
16

O ile rozumiem z książek i instrukcji bash jest to. Gdy użytkownik wyloguje się z bash, wszystkie zadania w tle uruchomione przez użytkownika zostaną automatycznie zakończone, jeśli nie używa nohup lub wyłączy się. Ale dzisiaj przetestowałem to:W jaki sposób bash obsługuje zadania podczas wylogowywania?

  1. Zalogowałem się na moim pulpicie gnome i dostęp do terminalu gnome.
  2. Istnieją dwie karty w terminalu iw jednym stworzyłem nowy test o nazwie użytkownika i zalogować się jako test

    su - test 
    
  3. rozpoczął skrypt.

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. Potem wylogowanie z testu i zamknął Tab

  5. W następnej zakładce ja exected ps aux jako root i okazało się, że praca jest jeszcze uruchomiony.

Jak to się dzieje?

+0

Zauważyłem, że to pytanie nie ma jeszcze zaakceptowanej odpowiedź i że istnieje podobna nowe pytanie na [SU], które mogą być interesujące czytanie: [http: // superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-hehell-is-exited](http://superuser.com/questions/662431/what -exactly-określa-jeśli-a-tło-job-jest-zabity-kiedy-powłoki-jest-zakończony) – Hennes

Odpowiedz

2

Tylko interaktywne powłoki zabijają zadania po ich zamknięciu. Inne powłoki (na przykład te, które otrzymujesz przy użyciu su - username) nie robią tego. Interaktywne powłoki zabijają tylko bezpośrednie podprocesy.

+0

Ta sama sztuczka na moim mac bez "su". – khachik

+0

Co to jest interaktywna powłoka? – Unni

+0

Co to jest powłoka interaktywna? http://tldp.org/LDP/abs/html/intandnonint.html mówi, że jeśli $ PS1 jest ustawione, to jest to interaktywna powłoka. Również przełączyłem się na inne tty za pomocą ctrl + alt + f2 i zalogowałem się jako test i zrobiłem to samo. Wynik jest taki sam, ale. – Unni

12

To, czy uruchamianie zadań w tle jest kończone przy wyjściu, zależy od powłoki. Bash normalnie tego nie robi, ale można go skonfigurować dla powłok logowania (shopt -s huponexit). W każdym razie dostęp do tty jest niemożliwy po zakończeniu procesu kontrolowania (takiego jak powłoka logowania).

Sytuacje, które zawsze powodują SIGHUP obejmują:

  • coś w planie, gdy tty jest zamknięty.
  • Każde zadanie w tle obejmujące zatrzymane procesy po zakończeniu ich powłoki (SIGCONT i SIGHUP). Muszle zwykle ostrzegają przed dopuszczeniem do tego.

podsumowanie huponexit:

$ shopt -s huponexit; shopt | grep huponexit 
huponexit  on 
# Background jobs will be terminated with SIGHUP when shell exits 

$ shopt -u huponexit; shopt | grep huponexit 
huponexit  off 
# Background jobs will NOT be terminated with SIGHUP when shell exits 
+2

więc mówisz, że jeśli opcja huponexit nie jest ustawiona, bash nie zabije zadań tła użytkowników? – Unni

+0

@Unni - Jeśli ustawione jest 'huponexit', Bash wyśle ​​SIGHUP do wszystkich zadań, gdy wyjdzie interaktywna powłoka logowania (z ** wyjściem ** lub ** Ctrl + d **). –

Powiązane problemy