Nohup Job in den Vordergrund bringen


14

Betrachten Sie die folgende nohupAusführung:

nohup script.sh > script.out &

Gibt es eine Möglichkeit, sich vom Terminal abzumelden, die Verbindung wiederherzustellen, den Vorgang wieder in den Vordergrund zu stellen und über die Tastatur mit ihm zu interagieren?

Antworten:


7

Wenn Sie ein Skript starten möchten, das ausgeführt werden soll, ohne dass die Ausgabe Ihr Terminal stört, und es dann später aufrufen möchten, um mit ihm zu interagieren, sollten Sie sich einen Terminal-Multiplexer ansehen. Abhängig von Ihrem System würde ich tmuxoder empfehlen screen. Informationen zur Verwendung finden Sie unter den folgenden Links:

tmux:

Bildschirm:

edit: Links für tmux Primer hinzugefügt


+1 Exzellentes Tool, von dem ich nichts wusste. Danke vielmals.
Adam Matan

19

nohup trennt einen Befehl nicht vom Terminal, lässt Ihr Skript ignorierenSIGHUPund leitet ihnstdout/stderrin eine Datei umnohup.out, sodass der Befehl nach dem Abmelden im Hintergrund weiter ausgeführt werden kann.

nohupstellt den ausgeführten Befehl nicht automatisch in den Hintergrund. Man muss das explizit tun, indem man die Kommandozeile mit einem beendet &.

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobskann aktuell ausgeführte Jobs und deren Status drucken. Wenn der Befehl jobsihn nicht finden kann, ist er kein untergeordneter Prozess dieser Shell mehr.

$ jobs 
[1]+  Running                 nohup ./script.sh &

Man kann einen Hintergrundjob in Bash zurück in den Vordergrund bringen, fgselbst wenn er mit ausgeführt wird nohup. Dies ändert jedoch nichts an der Ausgabeumleitung, die weiterhin in die Datei verschoben wirdnohup.out .

$ fg
nohup ./script.sh

Wenn Sie die Shell / das Terminal schließen oder sich abmelden, ist Ihr Befehl kein untergeordnetes Element dieser Shell mehr. Es gehört zum initProzess. Wenn Sie in suchen pstree, sehen Sie, dass es jetzt Prozess 1 gehört ( init). Das kann nicht wieder in den Vordergrund gebracht werden, da der Vordergrund nicht mehr existiert.


If the command jobs cannot find it, then it is no longer a child process of that shell.Das ist falsch: versuchen , diese Sequenz zu sehen , wie: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Nach diesem Befehl wird weiterhin die sleepArbeit mit der gleichen PID gedruckt, als Sie sie erzeugt haben, während jobsnichts gedruckt wird. Die einzige Möglichkeit, wie ein untergeordneter Prozess aufhören kann, ein untergeordnetes Element zu sein, besteht darin, das übergeordnete Element zu verlieren (dann wird das verwaiste Element zum inituntergeordneten Element) oder zu forken und zu beenden (aber dann ändert sich die PID, sodass es nicht das ursprüngliche untergeordnete Element ist).
Ruslan

4

Ich werde die Verwendung eines Terminal-Multiplexers unterstützen, aber tmux , nicht screen. Der Bildschirm ist in jeder Hinsicht nicht gewartet. Seine Konfiguration ist eine dunkle Kunst, die wahrscheinlich zuerst in einem Anhang des Necronomicon aufgezeichnet wurde. Der Versuch, eine eigene Konfiguration zu schreiben, ist ein Einblick in Cthulu. Ernsthaft. Schauen Sie sich die .screenrc-Dateien der Leute an . Um sicher zu gehen, gibt es verschiedene Möglichkeiten, um die Abscheulichkeit einer Konfigurationsdatei auf dem Bildschirm zu vermitteln. Byobu leistet eine bewundernswerte Arbeit als Schleier zwischen sterblichen Nutzern und unheiligem Code. Es kommt mit sinnvollen Farben, einer Menüoberfläche und vielleicht am wichtigsten, einer Statusleiste.

Aber wie gesagt, ich empfehle stattdessen tmux . Es sind noch einige kleinere Konfigurationsschritte erforderlich, aber es ist gut dokumentiert , und Ihre Konfigurationsdatei sieht nicht nach Kauderwelsch aus. Außerdem beginnen Sie mit Farben und einer Statusleiste. Vergleichen Sie meine Dateien screenrc und tmux.conf:


0

Wenn Sie nur daran interessiert sind, live zu schauen, könnte die Ausgabe zu Ihnen passen:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

Jeder Linux-Befehl kann an den Hintergrund gesendet werden, wobei " &" zuletzt angehängt wird.

Um alle Hintergrundjobs anzuzeigen, können Sie eine Ausgabe ausführen jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

Hier habe ich 3 Jobs im Hintergrund: Zookeeper, Kafka und Mongo Daemon. [1], [2] und [3] sind die jeweiligen Auftragsnummern für diese Aufgaben.

Sie können diese Aufgabe mit in den Vordergrund bringen fg %$taskNumber.

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.