Co oznacza „&” na końcu polecenia systemu Linux?

98

Jestem administratorem systemu i poproszono mnie o uruchomienie skryptu linux w celu wyczyszczenia systemu.

Polecenie jest takie:

perl script.pl > output.log &

więc to polecenie kończy się &znakiem, czy ma jakieś szczególne znaczenie?

Mam podstawową wiedzę na temat powłoki, ale nigdy wcześniej tego nie widziałem.

Koleś
źródło
przepraszam, wiem o takich podstawowych rzeczach
stary,
3
Jeśli jesteś na tej stronie i szukasz różnicy między &a &&: &wykonuje pierwszą komendę w tle; &&wykonuje pierwsze polecenie i warunkowo przechodzi do drugiego, jeśli zakończy się pomyślnie.
David Bodow

Odpowiedzi:

150

&Sprawia polecenia działają w tle.

Od man bash:

Jeśli polecenie zostanie zakończone przez operatora sterującego & , powłoka wykonuje polecenie w tle w podpowłoce. Powłoka nie czeka na zakończenie polecenia, a stan powrotu to 0.

mgarciaisaia
źródło
12

Dodatkowo możesz użyć znaku „&”, aby uruchomić wiele procesów przez jedno (1) połączenie ssh, aby zachować minimalną liczbę terminali. Na przykład, mam jeden proces, który nasłuchuje wiadomości w celu wyodrębnienia plików, drugi proces nasłuchuje wiadomości w celu przesłania plików: Używając „&” mogę uruchomić obie usługi na jednym terminalu, poprzez pojedyncze połączenie ssh z moim serwerem .


***** Właśnie zdałem sobie sprawę, że te procesy działające przez „&” będą również „żyły” po zamknięciu sesji ssh! całkiem zgrabne i przydatne, jeśli połączenie z serwerem zostanie przerwane **

Zack S
źródło
nohupbędzie również podtrzymywać procesy.
Jerry Chin
2
z & możemy również uzyskać PID, abyśmy mogli zakończyć proces, jeśli chcemy, a także możemy sprawdzić stan tego procesu
Dhaval Solanki
12

Jeśli nie powiedziano inaczej, polecenia przejmują pierwszy plan. Masz tylko jeden proces „pierwszego planu” działający w jednej sesji powłoki. Symbol & instruuje polecenia, aby były uruchamiane w procesie w tle i natychmiast wraca do wiersza poleceń w celu uzyskania dodatkowych poleceń.

sh my_script.sh &

Proces w tle nie pozostanie aktywny po zamknięciu sesji powłoki. SIGHUP kończy wszystkie uruchomione procesy. W każdym razie domyślnie. Jeśli Twoje polecenie jest długotrwałe lub działa przez czas nieokreślony (np. Mikrousługa), musisz je uruchomić bez hup, aby działało po rozłączeniu się z sesją:

nohup sh my_script.sh &

EDYCJA: Wygląda na to, że występuje szary obszar dotyczący zamykania procesów w tle, gdy używane jest &. Należy tylko pamiętać, że powłoka może zamknąć proces w zależności od systemu operacyjnego i lokalnych konfiguracji (szczególnie na CENTOS / RHEL): https://serverfault.com/a/117157 .

Timothy Jannace
źródło
2

Nie wiem na pewno, ale właśnie czytam książkę i otrzymuję informację, że program musi obsłużyć swój sygnał (tak jak wtedy, gdy naciskam CTRL-C). Teraz program może użyć SIG_IGNdo zignorowania wszystkich sygnałów lub SIG_DFLprzywrócenia domyślnej akcji.

Teraz, jeśli to zrobisz, $ command &ten proces działający w tle po prostu ignoruje wszystkie sygnały, które wystąpią. W przypadku procesów pierwszoplanowych sygnały te nie są ignorowane.

Kaustubh Kislay
źródło