Wie kann ich den aktuell laufenden Linux-Prozess in den Hintergrund stellen? [geschlossen]

111

Ich habe einen Befehl, der Dateien mit git von der Linux-Shell auf einen Remote-Server hochlädt. Der Abschluss dauert viele Stunden.

Wie kann ich das laufende Programm in den Hintergrund stellen? Damit ich noch an der Shell arbeiten kann und dieser Prozess auch abgeschlossen ist?

Fata Morgana
quelle
Nur eine Vermutung, aber haben Sie versucht, Strg + Z zu drücken oder Ihren Befehl so auszuführen? #command &
EralpB
Der Befehl wird bereits ausgeführt, daher habe ich keine andere Option. Ich bin nicht sicher, welchen Befehl ich versuchen soll. Ich wollte den aktuellen Prozess nicht unterbrechen, also habe ich ihn nicht experimentiert
Mirage
Wir sollten dann auf eine professionellere Antwort warten :) Ich meinte, wenn Sie die Chance hätten, noch einmal von vorne zu beginnen. (Der Befehl & Ding)
EralpB
Der akzeptierte Antwortende auf diese Frage erklärt die drei Schritte, die unternommen werden müssen: stackoverflow.com/questions/625409/…
Leonard Saers
Sie können auch einfach eine zweite Instanz von Putty öffnen und erneut eine Verbindung zum Server herstellen, um eine weitere Shell zu erhalten. Obwohl die Lösung mit ctrl+zgroßartig ist.
Ela782

Antworten:

207

Unterbrechen Sie den Vorgang mit STRG + Z und setzen Sie ihn dann mit dem Befehl bgim Hintergrund fort. Beispielsweise:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Weitere Informationen zur Auftragssteuerung und bg-nutzung finden Sie auf der bashHandbuchseite:

JOB CONTROL
Wenn Sie das Suspend- Zeichen (normalerweise ^ Z, Control-Z) eingeben, während ein Prozess ausgeführt wird, wird dieser Prozess gestoppt und die Steuerung an bash zurückgegeben. [...] Der Benutzer kann dann den Status dieses Jobs mit dem Befehl bg bearbeiten, um ihn im Hintergrund fortzusetzen, [...]. A ^ Z wird sofort wirksam und hat den zusätzlichen Nebeneffekt, dass ausstehende Ausgaben und Typeahead verworfen werden.

bg [ jobspec ...] Setzen Sie
jede angehaltene Job- Jobspezifikation im Hintergrund fort, als ob sie mit & gestartet worden wäre. Wenn die Jobspezifikation nicht vorhanden ist, wird der Shell-Begriff des aktuellen Jobs verwendet.

BEARBEITEN

Starten eines Prozesses, bei dem Sie das Terminal sogar beenden können und es weiterhin ausgeführt wird

nohup [command] [-args] > [filename] 2>&1 &

z.B

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Um die Ausgabe einfach zu ignorieren (nicht sehr klug), ändern Sie den Dateinamen in /dev/null

Um die Fehlermeldung auf eine andere Datei zu setzen, ändern Sie die &1in einen Dateinamen.

Zusätzlich: Mit dem jobsBefehl können Sie eine indizierte Liste dieser Hintergrundprozesse anzeigen. Und Sie können einen Hintergrundprozess beenden, indem Sie ihn ausführen kill %1oder kill %2wobei die Nummer der Index des Prozesses ist.

Ed Heal
quelle
Ich habe es versucht, aber da es etwas ausgibt, steht es wieder im Vordergrund, wobei% zeigt, wie viele Daten hochgeladen wurden
Mirage
Der Prozess schreibt alle Ausgaben in das Terminal, wie Sie den Prozess zu Beginn angewiesen haben. Sie müssen es neu starten, damit die Ausgabe in eine Datei oder geschrieben werden kann /dev/null. Siehe oben bearbeiten.
Ed Heal
Das heißt, wenn der Prozess bereits gestartet ist, gibt es keine Möglichkeit, die Ausgabe umzuleiten
Mirage
Ja in der Tat. Sie können den Prozess nicht nur für die Shell ausführen, von der aus er ausgeführt wird. Sie könnten a kill -9 <pid of your shellausführen, und dann wird der Prozess weiterhin ausgeführt und die Ausgabe wird weggeworfen. Sie müssen sich jedoch erneut anmelden, um eine neue Shell zu starten.
Ed Heal
Sie können den disownBefehl auch verwenden, wenn Sie sich von Ihrer Terminalsitzung abmelden müssen und möchten, dass er weiter ausgeführt wird.
Kirk Roerig