Wenn ich dies nach einem längeren Gespräch mit einem Kollegen frage, möchte ich hier wirklich eine Klarstellung.
Ich starte einen Hintergrundprozess, indem ich entweder " &
" an die Befehlszeile anhänge oder indem ich CTRL-Z
ihn mit " bg
" stoppe und im Hintergrund mit " " wieder aufnehme. Dann melde ich mich ab.
Was geschieht?
Wir waren uns ziemlich sicher, dass es von einem SIGHUP hätte getötet werden sollen, aber das ist nicht geschehen; Beim erneuten Anmelden lief der Prozess problemlos und pstree
zeigte, dass er von "übernommen" wurde init
.
Ist das das erwartete Verhalten?
Aber wenn ja, wozu dient der nohup
Befehl? Es sieht so aus, als würde der Prozess sowieso nicht beendet werden, mit oder ohne ...
Bearbeiten 1
Einige weitere Details:
- Der Befehl wurde über eine SSH-Sitzung und nicht über die physische Konsole gestartet.
- Der Befehl wurde ohne
nohup
und / oder gestartet&
. es wurde dann mit suspendiertCTRL-Z
und im Hintergrund mit wieder aufgenommenbg
. - Die SSH-Sitzung wurde nicht abgebrochen. Es gab eine tatsächliche Abmeldung ("
exit
" Befehl). - Der Vorgang war ein
scp
Dateikopiervorgang. - Beim erneuten Anmelden wurde angezeigt,
pstree
dass der Prozess ausgeführt wird und untergeordnet ist voninit
.
Bearbeiten 2
Um die Frage klarer zu formulieren: Wird ein Prozess, der in den Hintergrund gestellt wird (mit &
oder bg
) SIGHUP
, genauso ignoriert wie der nohup
Befehl?
Bearbeiten 3
Ich habe versucht, manuell ein an SIGHUP
zu senden scp
: es wurde beendet, sodass das Signal definitiv nicht ignoriert wird.
Dann habe ich versucht, es erneut zu starten, in den Hintergrund zu stellen und mich abzumelden: Es wurde von "adoptiert" init
und lief weiter, und ich fand es dort, als ich mich wieder anmeldete.
Ich bin jetzt ziemlich verwirrt. Es sieht so aus, SIGHUP
als ob beim Abmelden überhaupt kein gesendet wurde.
quelle
1>/dev/null 2>&1
umgeleitet, zB für Bash, etc.?Antworten:
Antwort gefunden.
Für BASH hängt dies von der
huponexit
Shell-Option ab, die mit dem integriertenshopt
Befehl angezeigt und / oder festgelegt werden kann .Diese Option ist anscheinend standardmäßig deaktiviert, zumindest auf RedHat-basierten Systemen.
Mehr Infos auf der BASH-Manpage :
quelle
Ich stimme Warner zu und möchte nur hinzufügen, dass Sie die Shell davon abhalten können, SIGHUP mit dem eingebauten "disown" -Befehl zu senden. Die Bash-Manpage enthält eine gute Beschreibung.
quelle
Mit dem Befehl nohup können Sie den Befehl starten und die Ausgabe in eine nohup-Ausgabedatei umleiten. Von der Nohup-Manpage:
Die andere Option ist die Verwendung des Befehls screen . Die Verwendung von screen hat den Vorteil, dass Sie später erneut eine Verbindung zum Prozess herstellen können.
quelle
Wenn Sie einen Prozess in den Hintergrund stellen, handelt es sich weiterhin um den untergeordneten Prozess der Shell, die ihn ausführt.
Alle untergeordneten Prozesse, die unter einer Shell ausgeführt werden, erhalten beim Beenden ein SIGHUP. Die Leistung variiert geringfügig, abhängig von der genauen Situation, die ausführlich in der Manpage von bash beschrieben wird. Andere Muscheln haben wahrscheinlich ähnliche Beschreibungen.
Apache und andere Daemons laden normalerweise die Konfiguration auf SIGHUP neu. Userspace-Dienstprogramme sterben oft. Die mit Signalen verknüpfte Anwendungsleistung kann für die Anwendung eindeutig sein.
quelle
Wie war der Prozess? Die in der vorherigen Veröffentlichung 1 beschriebene Leistung war korrekt.
Bestimmte Skriptfunktionen und -prozesse können Signale abfangen. while-Schleifen können wie verrückt davonlaufen.
Sehen:
SSH-Sitzung wird abgebrochen - Wird der Befehl weiterhin ausgeführt?
Bearbeiten Sie 1 um 16:22 Uhr
Aus der Bash-Manpage:
Erste Untersuchungen 1 zeigen, dass OpenSSH wahrscheinlich SIGHUP ignoriert, möglicherweise mehr Signale.
quelle
Wenn Sie den Befehl nicht über ein Tool wie gestartet haben, führen Sie am Ende
screen
der Sitzung alle Jobs / Aufgaben aus, die dieser Sitzung zugeordnet sind.quelle
tail -f
in der temporären Datei zu sehen). Dies auf einem CentOS 7.1-Computer mit bash.