So führen Sie ein Shell-Skript im Hintergrund aus und erhalten keine Ausgabe

111

Ich habe zwei Shell-Skripte geschrieben a.shund b.sh. In a.shund b.shich haben eine Endlosschleife und sie drucken eine Ausgabe an das Terminal. Ich möchte ein anderes Skript schreiben, das beide aufruft, a.shund b.shich möchte, dass der Benutzer sofort die Kontrolle über das Terminal wiedererlangt, anstatt das Skript unendlich laufen zu lassen und die Ausgabe im Terminal auszublenden.

Behnam Safari
quelle

Antworten:

220

Verwenden nohupSie diese Option, wenn der Abschluss Ihres Hintergrundjobs lange dauert oder Sie nur SecureCRT oder ähnliches verwenden, um sich beim Server anzumelden.

Leiten Sie stdout und stderr um /dev/null, um die Ausgabe zu ignorieren.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
George
quelle
Nur um hinzuzufügen, manchmal gibt es Argumente für die Skripte, dann gibt der obige Befehl eine mehrdeutige Ausgabeumleitung zurück .
Sabertooth 1990
Ein besserer Weg, den ich gefunden habe, ist zu verwenden, nohup /path/to/your/script.sh parameter1 > & 1 &wenn jemand einen besseren Weg kennt.
Sabertooth 1990
17
Sie brauchen es nicht, /dev/null 2>&1wenn Sie es verwenden, nohupda bereits alle STDOUT- und STDERR-Streams automatisch an die Datei nohup.out angehängt werden. Verwenden Sie nur:nohup /path/to/your/command &
Leonardo
1
@ Sabertooth1990 Ihre Befehlszeile ist fehlerhaft:-bash: syntax error near unexpected token '&'
Notizen-jj
1
Wie würden Sie dann den erstellten Prozess beenden?
Alexis_A
32

Leiten Sie die Ausgabe in eine Datei wie folgt um:

./a.sh > somefile 2>&1 &

Dadurch werden sowohl stdout als auch stderr in dieselbe Datei umgeleitet. Wenn Sie stdout und stderr in zwei verschiedene Dateien umleiten möchten, verwenden Sie Folgendes:

./a.sh > stdoutfile 2> stderrfile &

Sie können /dev/nullals eine oder beide Dateien verwenden, wenn Sie sich nicht für stdout und / oder stderr interessieren.

Weitere Informationen zu Weiterleitungen finden Sie in der Bash-Manpage .

Adam Zalcman
quelle
23

Es tut uns leid, dass dies etwas spät ist, aber wir haben die ideale Lösung für Somple-Befehle gefunden, bei denen Sie keine Standard- oder Fehlerausgabe wünschen (Gutschrift, wo sie fällig ist: http://felixmilea.com/2014/12/running-bash-commands-background -richtig/ )

Dadurch wird die Ausgabe auf Null umgeleitet und der Bildschirm bleibt frei:

command &>/dev/null &
DanteAlighieri
quelle
2
Hinweis: Der Befehl wird beendet, wenn das Terminal geschlossen wird.
Banane
1
Für alle, die dies in Zukunft betrachten und eine Lösung suchen, mit der Befehle nach Beendigung einer Sitzung ausgeführt werden können, würde ich screen oder tmux empfehlen. Sie führen unbedingt eine "Sitzung innerhalb einer Sitzung" aus, die fortgesetzt wird, nachdem Sie die erste Sitzung geschlossen haben. Sie können dann erneut eine Verbindung zur laufenden Sitzung herstellen, wenn Sie sich erneut anmelden. Ideal zum Ausführen von rsync-Sicherungen, z. B. wenn die Synchronisierung längere Zeit ausgeführt werden muss und Sie Ihre Sitzung nicht laufen lassen möchten.
DanteAlighieri
13

Wenn sie sich im selben Verzeichnis wie Ihr Skript befinden, das Folgendes enthält:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

Das & Ende wird Ihr Skript im Hintergrund ausgeführt.

Der > /dev/null 2>&1Teil ist nicht erforderlich - er leitet die Streams stdout und stderr um, sodass Sie sie nicht auf dem Terminal sehen müssen, was Sie möglicherweise für verrauschte Skripte mit viel Ausgabe tun möchten.

Michael Chinen
quelle
7

Führen Sie eine Unterschale aus, um Benachrichtigungen zu entfernen und STDOUT und STDERR zu schließen:

(&>/dev/null script.sh &)
Tom Hale
quelle
Dies ist die einzige Antwort, die auch keine Hintergrundjobprotokolle als [1] + 54765 done <emacs>Dankeschön
druckt
2

Wenn Sie das Skript in einem Linux-Kickstart ausführen möchten, müssen Sie es wie folgt ausführen.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
SARATH CHANDRAN
quelle
1
nohup sh -x runShellScripts.sh &
Vaquar Khan
quelle
was macht -xdas
Alper
0

Diese Beispiele funktionieren gut:

nohup sh prog.sh proglog.log 2> & 1 &

Für die Schleife können Sie Folgendes verwenden:

für i in {1..10}; do sh prog.sh; Schlaf 1; erledigt prog.log 2> & 1 &

Es funktioniert im Hintergrund und zeigt keine Ausgabe.

Ramin Ismayilli
quelle