Diese Frage ist alt und ich weiß immer noch nicht warum.
Ursprüngliche Frage im Jahr 2014:
In einem Gnome-Terminal-Tab lief ich
$ nohup chromium-browser &
Aber wenn ich die Terminal-Registerkarte schließe, wird sie chromium-browser
auch beendet. Soll das nicht nohup
verhindern? Gilles sagte:
Von Nohup und Disown kann gesagt werden, dass sie SIGHUP auf unterschiedliche Weise unterdrücken. nohup veranlasst das Programm, das Signal zunächst zu ignorieren (das Programm kann dies ändern). nohup versucht auch, dafür zu sorgen, dass das Programm kein steuerndes Terminal hat, damit es nicht vom Kernel SIGHUP gesendet wird, wenn das Terminal geschlossen wird. Verleugnung ist rein innerlich in der Hülle; es bewirkt, dass die Shell SIGHUP nicht sendet, wenn sie beendet wird.
Lässt Nohup Chrom-Browser SIGHUP nicht ignorieren?
Ich sehe dies auch auf anderen ausführbaren Dateien wie und Emacs (GUI-Modus). Aber nicht auf xeyes.
Dies geschieht unter Ubuntu 12.04, 32-Bit, als die Frage veröffentlicht wurde.
Update im Jahr 2015,
Jetzt starte ich Ubuntu 14.04 mit google-chrome
statt chromium-browser
installiertem. Dasselbe, was zuvor mit Chrom-Browser passiert ist, gilt jetzt auch für Google-Chrome. nohup google-chrome 2>/dev/null &
speichert es nicht vor dem Schließen, wenn die Terminalregisterkarte geschlossen wird. /usr/bin/google-chrome
ist ein Link zu einem Bash-Skript /opt/google/chrome/google-chrome
. Warum funktioniert die nohup
Anwendung auf das Bash-Skript nicht? Wie können wir dafür sorgen, dass es mit Bash-Skripten funktioniert? Was ist mit Python-Skripten?
xeyes
.Antworten:
Wenn Sie ein GNOME-Terminalfenster schließen, wird ein SIGHUP an die Shell gesendet, auf der es ausgeführt wurde. Die Shell sendet in der Regel ein SIGHUP an jede Prozessgruppe, von der sie weiß, dass sie erstellt wurde - auch an die Prozessgruppe, mit der sie begonnen hat
nohup
- und beendet diese anschließend. Wenn dies der Fall istbash
, wird das Senden eines SIGHUP an eine Prozessgruppe, die der Benutzer mit markiert hat, übersprungendisown
.Wenn Sie einen Befehl mit
nohup
ausführen, wird SIGHUP ignoriert, aber der Prozess kann dies ändern. Wenn die Disposition von SIGHUP für einen Prozess die Standardeinstellung ist, wird der Prozess beendet, wenn SIGHUP empfangen wird.Linux bietet einige Tools, um die Signaleinstellungen eines laufenden Prozesses zu überprüfen.
Das Chrom-Browser-Shell-Skript führt eine
exec
der kompilierten Anwendungen aus, sodass die Prozess-ID unverändert bleibt. Um die Signaleinstellungen zu sehen, bin ich gelaufennohup chromium-browser &
und habe mir dann/proc/$!/status
die Signalverteilung angesehen.Das sind Hex-Zahlen. Dies zeigt, dass SIGHUP nicht abgefangen und nicht ignoriert wird. Nur SIGPIPE (das 13. Bit in SigIgn) wird ignoriert. Ich habe dies auf den folgenden Code zurückgeführt :
Trotz des Kommentars werden vom übergeordneten Element ignorierte Signale nicht ignoriert. Ein SIGHUP tötet Chrom.
Die Problemumgehung besteht darin, das zu tun, worauf @ xx4h hinweist: Verwenden Sie den
disown
Befehl in Ihrer Bash, damit SIGHUP nicht an diechromium-browser
Prozessgruppe gesendet wird , wenn die Bash beendet werden muss . Sie können dazu eine Funktion schreiben:quelle
trap "" 1
würde, würde die Shell (und ihre Kinder) SIGHUP ignorieren. Ich werde das klären.trap
Befehle im Shell-Script-Wrapper verhindern dies nicht und die Ausführungnohup
kann dies nicht verhindern. Ich werde meine Antwort überarbeiten, um dies widerzuspiegeln.Wenn
chromium-browser
etwas in der Art ist,google-chrome
dann denke ich, ist das wahrscheinlichste Problem, dasschromium-browser
es nichtchromium
ist, sondern ein Shell-Wrapper ist, der den Zustand initialisiert, dannexec
schromium
.In meiner
google-chrome
Installation befindet sich die Binärdatei tatsächlich in/opt/google/chrome
und der Wrapper in/usr/bin
ist nur ein Shell-Skript, das viele Umgebungen in Bezug aufxdg-*
Standardwerte und absolute Pfade und ähnliches einrichtet, bevor es durch die eigentliche Binärdatei ersetzt wird.Zu diesem Zeitpunkt werden alle Signale, die
nohup
ursprünglich für das als untergeordnetes Element aufgerufene Skript ignoriert wurden, unwichtig. Wenn das Wrapper-Skript nicht darauf achtet , dass es anders angeordnet wird (was es nicht ist), wird die ctty vererbt.Versuchen Sie
file /usr/bin/chromium-browser
zu überprüfen, ob es das Shell-Skript ist, von dem ich denke, dass es es ist. Wenn ja, überlegen Sie, ob Sie es umschreiben möchten, damit es besser zu Ihnen passt.Ich kann sagen, dass nur
google-chrome 2>/dev/null &
so etwas für mich offen bleibt, aber ich kann mich nicht erinnern, ob das ein wahrscheinliches Ergebnis von Änderungen ist, die ich am Skript vorgenommen habe - es war vor über einem Jahr.quelle
chromium-browser
zuvor passiert ist, passiertgoogle-chrome
jetzt auch. Ich habe nichtchromium-browser
installiert.nohup google-chrome 2>/dev/null &
speichert es nicht vor dem Schließen, wenn die Terminalregisterkarte geschlossen wird.google-chrome
ist ein Bash-Skript/opt/google/chrome/google-chrome
. Warum funktioniert nohup, das auf ein Bash-Skript angewendet wird, nicht? Wie können wir dafür sorgen, dass es mit Bash-Skripten funktioniert? Was ist mit Python-Skripten?chrome
Binärdatei ersetzt wird.exec
Wollen Sie damit sagen, dass es im Skript eine aktuellechrome
Binärdatei gibt? Wie ändere ich dann das Skript? Hier ist mein/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... Oben$HERE
steht der Wert vonreadlink $0
(für den Sie den Installationspfad verwendengoogle-chrome
), aber/opt/google/chrome/chrome
die Binärdatei - durch die sich das Skript selbst ersetzt.exec
wohl einfach fallen lassen . Sie werden mit einer zusätzlichen PID (über die 1000 anderen hinaus) und einem wartenden Shell-Prozess fertig, aber ich denke, das ist das Ausmaß davon. Oder Sie könntenexec
w /nohup
vielleicht ersetzen . Alles hängt hauptsächlich davon ab, waschrome
toleriert wird - aber es sollte so funktionieren.Chrom scheint etwas Besonderes zu sein.
nohup chromium-browser & disown
sollte in diesem Fall funktionieren. Siehe auch: /programming/11421810/nohup-doesnt-work-with-chromiumquelle
nohup chromium-browser &
geht das nicht