Einen Befehl nach dem SSH-Logout im Hintergrund laufen zu lassen, geht am einfachsten mit nohup ./import.sh > import.log 2>&1 & — das deckt den Fall ab, in dem Sie vorher wissen, dass der Prozess die Sitzung überlebt. Aber es gibt fünf weitere Situationen, die dieser Befehl nicht löst: von nohup zu spät bemerkt bis zu einem Prozess, der nicht nur die SSH-Trennung, sondern auch einen Neustart überstehen muss.
1. Ich weiß vorher, dass der Prozess lange läuft
$ clai starte dieses Skript so, dass es eine SSH-Trennung übersteht, und schreib die Ausgabe in eine Datei→ nohup ./import.sh > import.log 2>&1 &
nohup fängt das SIGHUP ab, das ein Prozess bekommt, wenn sein Terminal geschlossen wird. & schickt ihn in den Hintergrund. Die Umleitung ist nicht optional: Ohne sie landet die Ausgabe in nohup.out im aktuellen Verzeichnis, und die suchen Sie später.
2. Ich hab ihn schon gestartet und nohup vergessen
$ clai löse den Prozess, den ich schon gestartet habe, vom Terminal — ich hab nohup vergessen→ Ctrl+Z; bg; disown -h %1
Ctrl+Z pausiert ihn, bg setzt ihn im Hintergrund fort, disown -h entfernt ihn aus der Job-Liste der Shell, damit er kein SIGHUP mehr bekommt. Die Rettungsoption, wenn der Prozess schon eine Stunde läuft und Abschießen keine Option ist.
3. Ich brauche eine vollständige Trennung von der Sitzung
$ clai starte diesen Befehl in einer eigenen Sitzung, komplett vom Terminal getrennt→ setsid --fork ./import.sh > import.log 2>&1
setsid erzeugt eine neue Sitzung und Prozessgruppe, sodass der Prozess gar keine Terminal-Signale erhält. Radikaler als nohup: Es gibt von Anfang an kein steuerndes Terminal zu verlieren.
4. Ich will später zurückkommen und nachsehen
$ clai starte das im Hintergrund, damit ich später wieder reingehen und nachsehen kann→ tmux new -d -s import './import.sh'
-d erstellt die Sitzung losgelöst. Später bringt Sie tmux attach -t import direkt zurück ins lebende Terminal des Prozesses. Die einzige Option hier, bei der Sie nicht nur zusehen, sondern eingreifen können.
5. systemd soll den Prozess überwachen
$ clai starte das als temporären systemd-Dienst, mit Logs und Status→ systemd-run --user --unit=import ./import.shRunning as unit: import.service; invocation ID: 74282bc256f144cdb323c19fc09452af
Das Log bekommen Sie über journalctl --user -u import, den Status über systemctl --user status import, und bei Bedarf automatische Neustarts. Die beste Option für alles, was sowohl Ihre Sitzung als auch einen Neustart überstehen muss.
6. Prüfen, ob der Prozess wirklich abgekoppelt ist
$ clai prüf, ob dieser Prozess wirklich vom Terminal getrennt ist→ ps -o pid,ppid,sid,tty,comm -p 12345
Steht in der Spalte TTY ein ?, gibt es kein steuerndes Terminal, und eine Trennung kann dem Prozess nichts anhaben. Steht dort pts/0, hängt er noch an Ihrer Sitzung und stirbt mit ihr.
Stolperfallen
nohupohne Umleitung schreibt in nohup.out. Die Datei landet im aktuellen Verzeichnis, oder im Home-Verzeichnis, wenn dort nicht geschrieben werden kann. Legen Sie den Pfad explizit fest.disownschützt nicht vor einem bereits gesendeten SIGHUP. Es entfernt den Job nur aus der Buchführung der Shell. Wenn das Terminal schon zu ist, ist es zu spät.- tmux und screen überleben keinen Neustart. Für alles, was einen Reboot überstehen muss, braucht es eine systemd-Unit, keinen Multiplexer.
Verwandte Fragen
nohup oder tmux? nohup ist "starten und vergessen", Ausgabe in eine Datei. tmux ist für den Fall, dass Sie zu einem laufenden Prozess zurückkehren und ihm etwas eingeben müssen.
Warum ist der Prozess trotzdem gestorben, nachdem ich mich abgemeldet habe? Entweder war es gar kein SIGHUP — er ist mit seinem Elternprozess gestorben — oder er ist selbst abgestürzt. Schauen Sie ins Log, falls Sie eins umgeleitet haben.
Wie sehe ich die Ausgabe eines bereits laufenden Hintergrundprozesses? Geht sie in eine Datei, nehmen Sie tail -f. Geht sie nirgendwohin, können Sie mit strace -p PID -e write oder den Deskriptoren in /proc/PID/fd nachsehen.
Siehe auch
- Cron ohne Kopfschmerzen
- Der Prozess, der nicht stirbt
- Remote-Aufgaben klar erklärt: ssh, scp und rsync
CliAI erinnert Sie nicht an nohup, wählt aber das passende Werkzeug für die Situation, bevor Sie etwas ausführen. In einer Zeile installieren.