Po co uruchamiać komendę powłoki systemu Linux za pomocą „&”?

30

Używam Red Hat Linux Enterprise w wersji 5. Zauważyłem, że ludzie czasami uruchamiają polecenia z kilkoma &opcjami. Na przykład w poniższym poleceniu są dwa &znaki. Jaki jest ich cel? Czy zawsze są używane razem z nohup?

nohup foo.sh <script parameters> >& <log_file_name> &
George2
źródło

Odpowiedzi:

15

Oprócz odpowiedzi Martina, Asha i Kevina czasami zobaczysz znak ampersand używany matematycznie do bitowego AND * :

$ echo $(( 11 & 7 ))
3

Jeśli nie znasz operatorów bitów:

11: 1011
 7: 0111
-------- AND
 3: 0011

W każdej pozycji jest jeden bit w pierwszej liczbie ORAZ w drugiej liczbie, ustaw ten bit na jeden w odpowiedzi.

* Funkcja w odpowiedzi Kevina jest nazywana logicznym AND.

Aby rozwinąć odpowiedź Asha, w przypadku przekierowania znak ampersand może powiedzieć powłoce, aby skopiowała deskryptor pliku. W tym poleceniu echo "hello" > outputfile 2>&1znak & powoduje, że każde wyjście, które może przejść do błędu standardowego (stderr, deskryptor pliku 2), przechodzi w to samo miejsce, co wyjście standardowe (stdout, deskryptor pliku 1, domyślny dla lewej strony >). >& outputfileOperatora jest skrótem > outputfile 2>&1.

Ponadto, nowe w Basha 4, są dwie nowe terminatory klauzul casepolecenia ;&i ;;&które mają wpływ czy przypadek „spada przez” i, jeśli tak, to czy następnego testu.

Wstrzymano do odwołania.
źródło
Fajnie, Dennis! Załóżmy, że używam dziennika terminali ssh do komputera, a następnie używam terminala ssh do wykonania polecenia (załóżmy, że proces trwa długo), a jeśli wyjdę z sesji terminala, to proces długoterminowy polecenia zostanie zakończony poprawnie? A jeśli chcę, aby polecenie kontynuowało wykonywanie nawet po wyjściu z powłoki, czy powinienem używać nohup, lub & (na końcu polecenia), czy używać zarówno nohup, jak i &?
George2
1
@ George2: Nie, >& filenamewypisuje stdout i stderr do tego samego pliku. Jeśli chcesz przekierować tylko stderr (i zostaw stdout w spokoju), zrobiłbyś to 2> filename. Co do drugiego pytania, najprawdopodobniej użyłbyś obu nohupi &.
Wstrzymano do odwołania.
1
@ George2: Jeśli nie wykonasz polecenia w tle, nie otrzymasz odpowiedzi z powłoki, abyś mógł wydać polecenie logoutlub exit.
Wstrzymano do odwołania.
2
George: Jeśli nie użyjesz &, nigdy nie otrzymasz odpowiedzi, aby zrobić cokolwiek innego. Terminal zostanie „zawieszony”, dopóki proces (cokolwiek to będzie) nie zakończy się lub nie zostanie zakończony / zabity. & Gwarantuje, że proces działa w tle. Jeśli jednak się wylogujesz, system operacyjny zakończy wszystkie procesy, co również zabije proces w tle. Jeśli używasz nohup , mówisz procesowi „zignoruj ​​polecenie, które cię zakończy”.
Martin Marconcini,
1
@ George2: Tak. „odporny na zawieszanie się” == „kontynuuj proces” i „non-tty” == „zamknij sesję konsoli terminala”
Wstrzymany do odwołania.
32

W skrypcie powłoki Bash ampersand „&” służy do rozwidlenia procesów:

find -name hello &

Spowoduje to rozwidlenie polecenia find i uruchomienie go w tle (zawsze możesz go zabić za pomocą jego PID).

Martin Marconcini
źródło
Dzięki Martin, załóżmy, że używam dziennika terminali ssh do komputera, a następnie używam terminala ssh do wykonania polecenia (załóżmy, że proces długookresowy), a następnie, jeśli wyjdę z sesji terminala, to proces długoterminowy polecenia zostanie zakończony poprawnie ? A jeśli wykonam polecenie za pomocą & w terminalu ssh, nawet jeśli zamknę terminal, długo działający proces polecenia nadal działa, prawda?
George2
1
To prawda George. Procesy w tle powinny być kontynuowane do momentu ich wyjścia lub zabicia. Jednak, jak już wspomniano, nie będziesz potrzebować nic, aby uniknąć śmierci procesu, gdy użytkownik się wyloguje.
Martin Marconcini,
Dzięki Martin! Chcę wiedzieć, dlaczego musimy używać zarówno &, jak i nohup, oraz jakie są ich indywidualne funkcje, które pozwalają nam osiągnąć cel polegający na tym, że polecenie może być kontynuowane, nawet jeśli konsola terminala zostanie zamknięta. Przeczytałem stronę podręcznika man dla nohup i wspomniano: „uruchom komendę odporną na zawieszanie się, z wyjściem na non-tty”, jestem zdezorientowany, czy odporność na zawieszanie się jest tym, co masz na myśli mówiąc, że pozwolenie na kontynuowanie działania komendy nie ma wpływu na zamknięcie konsola terminalowa? Jeśli tak, myślę, że użycie nohup wystarczy i nie trzeba używać &. Jakieś komentarze?
George2
1
Musisz użyć obu, jeśli nie używasz &, terminal nie pozwoli ci na wprowadzanie żadnych innych poleceń. Najlepszym sposobem, aby to zobaczyć, jest po prostu wypróbowanie. Dobrym przykładem jest polecenie, które zajmuje trochę czasu, na przykład find: find -name SomeName /> somefile.txt wypróbuj to z nohup i & i zobacz różnice.
Martin Marconcini,
To świetna odpowiedź na pytanie nohup: serverfault.com/questions/311593/…
joshperry
26

Po co uruchamiać komendę powłoki systemu Linux za pomocą „&”?

Aby natychmiast otrzymać monit, i uruchom proces w tle.

Jakie są ich funkcje?

nohup pozwala procesowi działającemu w tle kontynuować działanie nawet po wylogowaniu użytkownika (lub wyjściu z powłoki inicjującej).

> & przekierowuje zarówno standardowe wyjście, jak i standardowy błąd do pliku dziennika.

i uruchamia wszystko w tle, natychmiast zwracając monit.

Wyjaśnienie:

Każdy proces Linuksa otwiera trzy kanały We / Wy, wejście „stdin”, standardowe wyjście „stdout” i standardowe wyjście błędu „stderr”. Można ich używać w formacie binarnym, ale tradycyjnie są to teksty. Kiedy większość programów widzi stdin close, wychodzą (może to zmienić programista).

Kiedy powłoka rodzicielska wychodzi, stdin jest zamykany na dzieci i (często, zwykle) dzieci również wychodzą. Ponadto dzieci otrzymują sygnał programowy, SIGHUP, wskazujący, że użytkownik „rozłączył się” (wcześniej modem), a domyślnym ustawieniem jest również wyjście. (Uwaga: programista może to wszystko zmienić podczas pisania programu).

Nohup daje więc procesowi potomnemu oddzielne środowisko we / wy, wiążąc wejścia i wyjścia z czymś niepowiązanym z powłoką nadrzędną i osłaniając dziecko przed sygnałem SIGHUP. Gdy użytkownik rozłączy się, zobaczysz proces w tle nohup należący do init (proces 1), a nie jego powłokę.

Jednak nohupnie można wykonać zadania całkowicie, jeśli proces jest uruchamiany na pierwszym planie, dlatego &służy do uruchamiania programu w tle, gdzie może on z radością pozostać uruchomiony z zalogowanym użytkownikiem lub bez niego.

kmarsh
źródło
Załóżmy, że używam dziennika terminali ssh do komputera, a następnie używam terminala ssh do wykonania polecenia (załóżmy, że proces trwa długo), a jeśli wyjdę z sesji terminala, to proces długoterminowy polecenia zostanie zakończony poprawnie? A jeśli chcę, aby polecenie kontynuowało wykonywanie nawet po wyjściu z powłoki, czy powinienem używać nohup, lub & (na końcu polecenia), czy używać zarówno nohup, jak i &?
George2
1
Prawidłowo, użyj zarówno nohup, jak i &, aby kontynuować proces po rozłączeniu SSH.
kmarsh
Dzięki Kmarsh! Chcę wiedzieć, dlaczego musimy używać zarówno &, jak i nohup, oraz jakie są ich indywidualne funkcje, które pozwalają nam osiągnąć cel polegający na tym, że polecenie może być kontynuowane, nawet jeśli konsola terminala zostanie zamknięta. Przeczytałem stronę podręcznika man dla nohup i wspomniano: „uruchom komendę odporną na zawieszanie się, z wyjściem na non-tty”, jestem zdezorientowany, czy odporność na zawieszanie się jest tym, co masz na myśli mówiąc, że pozwolenie na kontynuowanie działania komendy nie ma wpływu na zamknięcie konsola terminalowa? Jeśli tak, myślę, że użycie nohup wystarczy i nie trzeba używać &. Jakieś komentarze?
George2
1
Przeredaguję swoją odpowiedź, aby odpowiedzieć.
kmarsh
13

Oprócz odpowiedzi @ Martina: Inne użycie znaku handlowego i ( >&jak wyżej) polega na przechwytywaniu obu znaków stdouti stderr. Normalnie, jeśli przekierujesz dane wyjściowe do pliku zawierającego tylko „>”, otrzymasz tylko dane wyjściowe stdout, bez żadnych błędów.

Popiół
źródło
1. Dzięki Ash, chcę z tobą potwierdzić, że „> & <nazwa pliku dziennika>”, zrzuci wszystkie stderr i stdout do pliku dziennika, prawda? 2. A użycie „> <nazwa pliku dziennika>” spowoduje zrzucenie wszystkich plików stdout do pliku dziennika, prawda?
George2
1
@George: Tak, zgadza się.
Ash
Dzięki Ash! Chcę wiedzieć, dlaczego musimy używać zarówno &, jak i nohup, oraz jakie są ich indywidualne funkcje, które pozwalają nam osiągnąć cel polegający na tym, że polecenie może być kontynuowane, nawet jeśli konsola terminala zostanie zamknięta. Przeczytałem stronę podręcznika man dla nohup i wspomniano: „uruchom komendę odporną na zawieszanie się, z wyjściem na non-tty”, jestem zdezorientowany, czy odporność na zawieszanie się jest tym, co masz na myśli mówiąc, że pozwolenie na kontynuowanie działania komendy nie ma wpływu na zamknięcie konsola terminalowa? Jeśli tak, myślę, że użycie nohup wystarczy i nie trzeba używać &. Jakieś komentarze?
George2
4

Oprócz odpowiedzi Martina i Asha czasami możesz zobaczyć użycie &&tokena. Służy to do powiedzenia „uruchom drugie polecenie, jeśli i tylko jeśli pierwsze polecenie zakończyło się powodzeniem”. Dobrze napisane polecenie, jeśli zawiera jakieś błędy, nie zakończy się pomyślnie.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
Kevin M.
źródło
Fajnie, Kevin! Załóżmy, że używam dziennika terminali ssh do komputera, a następnie używam terminala ssh do wykonania polecenia (załóżmy, że proces trwa długo), a jeśli wyjdę z sesji terminala, to proces długoterminowy polecenia zostanie zakończony poprawnie? A jeśli chcę, aby polecenie kontynuowało wykonywanie nawet po wyjściu z powłoki, czy powinienem używać nohup, lub & (na końcu polecenia), czy używać zarówno nohup, jak i &?
George2
Każdy z nich działałby. Wyobrażam sobie, że NOHUP to oryginalny sposób (ale zgaduję całkowicie), ale tło działa teraz. Ważna różnica polega na uruchomieniu interaktywnej powłoki przez sshing do zdalnego systemu. Proces NOHUP działałby na pierwszym planie, ale kontynuowałby działanie, jeśli wyjdziesz, podczas gdy proces w tle powróciłby natychmiast po spawnowaniu polecenia. Ale kiedy próbujesz wyjść z interaktywnej powłoki za pomocą polecenia działającego w tle, najpierw zostaniesz ostrzeżony.
Kevin M,
2

Odpowiedź Martina jest dobra, ale trochę niejednoznaczna. Polecenie jest zawsze rozwidlane i wykonywane, ale normalnym zachowaniem powłoki jest czekanie na polecenie, aż zakończy działanie. Znak ampersand umieszcza go w tle, dzięki czemu możesz ponownie wyświetlić monit terminala i możesz robić inne rzeczy. Jeśli proces wyrzuca dane na standardowe wyjście lub na standardowe wyjście, zostanie to zmieszane z tym, co robisz w wierszu poleceń, i może cię pomylić. Właśnie dlatego przekierowujesz za pomocą> & /path/to/logfile.txt.

W odpowiedzi na George2 normalnym zachowaniem wychodzącym z powłoki jest wysłanie sygnału SIGHUP do wszystkich procesów w tej samej grupie procesów (zasadniczo rzeczy, które spawnowałeś) i zwykle się kończą. Jeśli chcesz, aby trwało to nawet po zamknięciu procesu powłoki, możesz użyć polecenia nohup, aby zignorować ten sygnał i kontynuować działanie. Istnieje specjalna nazwa dla tego typu procesu, zwana procesem demona (wymawiane jako „demon”).

Rich Homolka
źródło
Wielkie dzięki! Załóżmy, że używam dziennika terminali ssh do komputera, a następnie używam terminala ssh do wykonania polecenia (załóżmy, że proces trwa długo), a jeśli wyjdę z sesji terminala, to proces długoterminowy polecenia zostanie zakończony poprawnie? A jeśli chcę, aby polecenie kontynuowało wykonywanie nawet po wyjściu z powłoki, czy powinienem używać nohup, lub & (na końcu polecenia), czy używać zarówno nohup, jak i &? I dlaczego?
George2
Hej, George, przepraszam, odpowiadam tak późno. Tak, jeśli opuścisz powłokę, proces długoterminowy zostanie zakończony. Jeśli chcesz, żeby działał dalej, musisz zrobić zarówno nohup (aby nie kończyć go, gdy powłoka się zamyka), jak i & (umieścić w tle, abyś mógł Crtl-D lub opuścić powłokę). Możesz także spojrzeć na komendę setsid, która pozwoli na uruchomienie twojego procesu, ignorując SIGHUP w nieco inny sposób.
Rich Homolka
Świetna odpowiedź, wyjaśnia najlepsze praktyki dotyczące uruchomionych w tle procesów uruchomionych przez powłokę.
Marcel Valdez Orozco