2010-11-28 15 views
16

Soweit ich aus den Büchern und Bash Handbüchern verstanden habe, ist das. Wenn sich ein Benutzer von bash abmeldet, werden alle Hintergrundjobs, die vom Benutzer gestartet werden, automatisch beendet, wenn er nohup nicht verwendet oder verleugnet. Aber heute habe ich es getestet:Wie behandelt Bash die Jobs beim Abmelden?

  1. Angemeldet an meinem gnome-Desktop und den Zugriff auf gnome-terminal.
  2. Es gibt zwei Registerkarten im Terminal und in einem habe ich einen neuen Benutzer namens Test und angemeldet als Test

    su - test 
    
  3. ein Skript gestartet.

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. Danach habe ich aus Test angemeldet und schloss die Registerkarte

  5. Im nächsten Reiter I ps aux als root exected und festgestellt, dass Job noch läuft.

Wie ist das passiert?

+0

Ich bemerkte, dass diese Frage noch keine Antwort akzeptiert hat und dass es eine ähnliche neue Frage auf [SU], die interessant zu lesen sein könnten: [http: // superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-shell-is-exited](http://superuser.com/questions/662431/what -exactly-bestimmt-wenn-ein-Hintergrund-Job-ist-getötet-wenn-die-Shell-ist-exited) – Hennes

Antwort

2

Nur interaktive Shells beenden Jobs, wenn Sie sie schließen. Andere Shells (zum Beispiel diejenigen, die Sie mit su - username erhalten) tun das nicht. Und interaktive Shells töten nur direkte Teilprozesse.

+0

Der gleiche Trick auf meinem Mac ohne 'su'. – khachik

+0

Was ist interaktive Shell? – Unni

+0

Was ist interaktive Shell? http://tldp.org/LDP/abs/html/intandnonint.html sagt, dass, wenn $ PS1 gesetzt ist, es eine interaktive Shell ist. Auch ich wechselte zu einem anderen tty mit Strg + Alt + F2 und loggte sich als Test und das gleiche getan. Ergebnis ist gleich aber. – Unni

12

Ob die Ausführung von Hintergrundjobs beim Beenden beendet wird, hängt von der Shell ab. Bash tut das normalerweise nicht, kann aber für Login-Shells konfiguriert werden (shopt -s huponexit). In jedem Fall ist der Zugriff auf das tty unmöglich, nachdem der Steuerungsprozess (z. B. eine Login-Shell) beendet wurde.

Situationen, die immer SIGHUP verursachen umfassen:

  • Alles, was im Vordergrund, wenn die tty nach unten geschlossen.
  • Jeder Hintergrundjob, der gestoppte Prozesse beim Beenden der Shell enthält (SIGCONT und SIGHUP). Shells warnen Sie normalerweise, bevor Sie dies zulassen.

huponexit Zusammenfassung:

$ 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

Sie sagen also, dass wenn die Option huponexit nicht gesetzt ist, bash nicht die Hintergrundjobs der Benutzer auslöschen wird? – Unni

+0

@Unni - Wenn 'huponexit' gesetzt ist, sendet Bash SIGHUP an alle Jobs, wenn eine interaktive Login-Shell beendet wird (entweder ** exit ** oder ** Strg + d **). –

Verwandte Themen