Was bedeutet "&" am Ende eines Linux-Befehls?


91

Ich bin Systemadministrator und wurde gebeten, ein Linux-Skript auszuführen, um das System zu bereinigen.

Der Befehl lautet:

perl script.pl > output.log &

Dieser Befehl endet also mit einem &Zeichen. Gibt es eine besondere Bedeutung dafür?

Ich habe Grundkenntnisse in Shell, aber ich habe das noch nie gesehen.


Tut mir leid, ich wusste über solche grundlegenden Dinge Bescheid
Dude

1
Wenn Sie auf dieser Seite nach dem Unterschied zwischen &und suchen &&: &führt den ersten Befehl im Hintergrund aus; &&führt den ersten Befehl aus und fährt bedingt mit dem zweiten fort, wenn er erfolgreich beendet wird.
David Bodow

Antworten:


144

Das &macht den Befehl im Hintergrund ausgeführt werden .

Von man bash:

Wenn ein Befehl vom Steueroperator & beendet wird , führt die Shell den Befehl im Hintergrund in einer Subshell aus. Die Shell wartet nicht auf den Abschluss des Befehls und der Rückgabestatus ist 0.


12

Darüber hinaus können Sie das "&" -Zeichen verwenden, um viele Prozesse über eine (1) SSH-Verbindung auszuführen, um die Mindestanzahl von Terminals beizubehalten. Zum Beispiel habe ich einen Prozess, der auf Nachrichten wartet, um Dateien zu extrahieren, den zweiten Prozess, der auf Nachrichten wartet, um Dateien hochzuladen: Mit dem "&" kann ich beide Dienste in einem Terminal über eine einzige SSH-Verbindung zu meinem Server ausführen .


***** Ich habe gerade festgestellt, dass diese Prozesse, die das "&" durchlaufen, auch nach Abschluss der SSH-Sitzung "am Leben bleiben"! ziemlich ordentlich und nützlich, wenn Ihre Verbindung zum Server unterbrochen wird **


nohupwird auch Prozesse am Leben erhalten.
Jerry Chin

2
Mit & können wir auch PID erhalten, damit wir den Prozess beenden können, wenn wir wollen, und wir können auch den Status dieses Prozesses überprüfen
Dhaval Solanki

12

Wenn nicht anders angegeben, übernehmen Befehle den Vordergrund. In einer einzelnen Shell-Sitzung wird nur ein "Vordergrund" -Prozess ausgeführt. Das Symbol & weist Befehle an, in einem Hintergrundprozess ausgeführt zu werden, und kehrt sofort zur Befehlszeile zurück, um weitere Befehle zu erhalten.

sh my_script.sh &

Ein Hintergrundprozess wird nicht am Leben bleiben , nachdem die Shell - Sitzung geschlossen wird. SIGHUP beendet alle laufenden Prozesse. Standardmäßig sowieso. Wenn Ihr Befehl lange ausgeführt wird oder auf unbestimmte Zeit ausgeführt wird (z. B. Microservice), müssen Sie ihn mit nohup vorhängen, damit er nach dem Trennen von der Sitzung weiterhin ausgeführt wird:

nohup sh my_script.sh &

BEARBEITEN: Es scheint eine Grauzone bezüglich des Schließens von Hintergrundprozessen zu geben, wenn & verwendet wird. Beachten Sie jedoch, dass die Shell Ihren Prozess je nach Betriebssystem und lokalen Konfigurationen (insbesondere unter CENTOS / RHEL) möglicherweise schließt: https://serverfault.com/a/117157 .


1

Ich weiß es nicht genau, aber ich lese gerade ein Buch und bekomme, dass ein Programm sein Signal verarbeiten muss (wie wenn ich drücke CTRL-C). Jetzt kann ein Programm SIG_IGNalle Signale ignorieren oder SIG_DFLdie Standardaktion wiederherstellen.

Wenn Sie dies tun, $ command &ignoriert dieser Prozess, der als Hintergrundprozess ausgeführt wird, einfach alle Signale, die auftreten werden. Bei Vordergrundprozessen werden diese Signale nicht ignoriert.

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.