Ich half einem Kollegen, der Probleme mit einem Hintergrundprozess hatte, der zeitweise starb.
Ich fand heraus, dass sie den Hintergrundprozess starteten, indem sie sich beim Server anmeldeten und Folgendes ausführten:
su - <user> -c '<command>' &
"Aha", rief ich aus. "Wenn Sie einen Befehl mit" & "starten, wird er beim Verlassen des steuernden Terminals aufgelegt. Sie müssen so etwas wie nohup verwenden, um dies zu erreichen. Dieser Prozess muss wirklich die Ausführung als Daemon unterstützen, tut tut."
Wir haben den obigen Befehl getestet, um meinen Standpunkt zu demonstrieren, und ... es schien zu funktionieren: Der mit dem Befehl gestartete Prozess wurde nicht beendet, als wir das Terminal verließen, auf dem der obige Befehl ausgeführt wurde.
Befehl ist ein benutzerdefiniertes Python-Skript, dessen Ausgabe in eine Datei geht. Soweit ich das beurteilen kann, gibt es im Skript keine intelligente "Daemonize" -ähnliche Funktion. Es werden keine der Dinge ausgeführt, die erforderlich sind, um als Daemon ausgeführt zu werden, der auf der Wikipedia: Daemon (Computing): Creation- Seite aufgeführt ist.
Das Ausführen des Befehls verhält sich wie erwartet:
<command> &
exit
Im obigen Fall wird der durch den Befehl gestartete Hintergrundprozess beendet, wenn wir das Terminal verlassen.
Meine Frage lautet:
Was passiert, wenn wir "su - -c &" hinzufügen, das verhindert, dass der Prozess beendet wird, wenn unser Terminal beendet wird? Ich möchte in Bezug auf das steuernde Terminal, die Standardeingabe und -ausgabe usw. im Detail verstehen.
Ist dies ein vernünftiger Weg, um das Ziel zu erreichen, diesen Befehl als Hintergrundprozess auszuführen? Wenn nicht warum, nicht?
Ich möchte Best Practices in meinem Unternehmen verbreiten, muss jedoch in der Lage sein, meine Empfehlungen zu demonstrieren und zu unterstützen.
Ich möchte auch verstehen, was genau los ist.
quelle
chroot --userspec root:root / sh -c "exec some_forever_process" &
. Der Job wird als derselbe Benutzer ausgeführt, ohnenohup
vorher oderdisown
später explizit . Wie kommt es also, dass das Signal in diesem Fall beim Term Exit nicht geliefert werden kann?some_forever_process
sollte für immer ausgeführt werden (ein Daemon) und schützt sich so vor dem Empfang von SIGHUP von einem Terminal-Exit (durch Ausführen in einer eigenen Prozessgruppe).