Führen Sie das Bash-Skript im Hintergrund aus und beenden Sie das Terminal


Antworten:


45

Um zu vermeiden, dass Exit-Signale an untergeordnete Prozesse des Terminals und der Shell weitergegeben werden, führen Sie den Befehl folgendermaßen aus nohup:

nohup cmd &

1
Das ist die richtige Antwort. Ohne nohup wird der gestartete Prozess immer noch als "Kind" des Terminalprozesses betrachtet und somit abgebrochen, wenn das Terminal geschlossen wird.
Izzy

3
cmd & disownfunktioniert auch, da das &wie ein ;Befehlstrennzeichen behandelt wird . Der Befehl disown entfernt die Verbindung zwischen der Bash-Shell-Sitzung und dem Befehl backgrounded.
Lornix

2
zsh hat eine Abkürzung für diese: cmd &|.
Thor

Damit dies funktioniert, musste ich eine Einstellung in Terminal.app ändern. Unter Profile, wählen Sie Ihr aktives Profil, dann Shell> Wenn die Shell beendet> Schließen , wenn die Schale sauber verlassen
antoine

6

Verwenden von screen:

screen -S <session name> -d -m <your command>

Danach können Sie das Terminal verlassen und eine erneute Verbindung herstellen, indem Sie:

screen -r <session name>

Weitere Infos: Referenz


4

Wenn Sie nach dem Verlassen des Terminals etwa jede Sekunde einen bestimmten Befehl oder eine bestimmte Datei im Hintergrund ausführen möchten, können Sie diese einfache Kleinigkeit ausprobieren.

nohup watch -n5 'bash script.sh' &

Das würde scipt.sh alle 5 Sekunden ausführen.


1
"nohup" wird bereits von der akzeptierten Antwort abgedeckt. Und ich bin mir ziemlich sicher, dass der Fragesteller cron erwähnt hat, weil er damit "Führen Sie diesen Befehl in einigen Sekunden in der Zukunft aus" und nicht in regelmäßigen Abständen aus.
David Richerby

1
Meine Antwort macht die Sache nicht schlimmer. Sehen Sie den Punkt der Abstimmung nach unten. Neuronale würde ausreichen.
Jamietelin

3

Fügen Sie nach Ihrem Befehl ein "&" ein.

z.B:

/home/your/script.sh &

7
In diesem Fall wird der Prozess beim Schließen des Terminals durch gestartet, /home/your/script.shda er nicht von seinem "übergeordneten", sondern nur "im Hintergrund" getrennt wurde. Verwenden Sie nohup, um es für echte abzunehmen.
Izzy

Meine schlechte, ich wusste nichts davon, aber als ich auf meinem Debian getestet habe, wurde der Befehl weiter ausgeführt, nachdem die Shell geschlossen wurde, die ihn gestartet hat: /
Flinth

1
Ich bin nicht sicher, wo genau der Hintergrundprozess hängt und wann. Wenn Sie sich jedoch beispielsweise bei einem Remotecomputer anmelden, wird dieser definitiv gestoppt, sobald Sie sich abmelden (es sei denn, er hat sich selbst als Daemon deklariert ). Um 100% sicher zu sein, verwenden Sie lieber nohup-, das auch alle (jetzt unsichtbaren) Ausgaben in einer Datei mit dem Namen protokolliert, die nohup.outsich in dem Verzeichnis befindet, von dem aus Sie den Befehl gestartet haben.
Izzy

Okay, danke für deine Erklärungen ^^
Flinth

Diese Antwort könnte in Kombination mit dem jobsBefehl in Ordnung sein. Sehr oft möchte ich in der Lage sein, nach dem Hintergrund des Shell-Prozesses wieder zum Shell-Prozess zurückzukehren.
Djangofan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.