Co oznacza symbol ampersand (&) w `nohup`?

11

Widziałem mnóstwo przykładów, w których &po końcu ciągu polecenia występuje ciąg, ale nie mogę znaleźć wyjaśnienia, co robi. To nie jest nawet w nohup„s manstronie. Czy to jest sprawa skorupy?

Zarówno przy użyciu, jak &i nie, okazuje się, że jakikolwiek uruchomiony proces nohupwydaje się wykazywać odporność na każdy sygnał zawieszenia.

Chad Harrison
źródło
1
„Uważam, że jakikolwiek proces przebiegający z nohup wydaje się wykazywać odporność na każdy sygnał zawieszenia”. Po to jest nohup.
Samuel Edwin Ward
Ok, więc wyjaśnię: jedyne przykłady, które widziałem, wykorzystują &, więc nie byłem pewien, czy &to jakiś modyfikator lub argument, który nohupzachowywałby się inaczej.
Chad Harrison
1
To rozsądne podejrzenie. W rzeczywistości nie modyfikuje zachowania nohup (nohup nawet go nie widzi), ale modyfikuje zachowanie powłoki.
Samuel Edwin Ward
nohup & -> Brak rozłączania i tło. Od starych dobrych czasów modemów i terminali szeregowych. Gdy mój terminal i modem przejdą w tryb offline, kontynuuj przetwarzanie w tle, aby zadanie zostało wykonane, kiedy następnym razem przejdę w tryb online.
Fiasco Labs

Odpowiedzi:

19

Z strony podręcznika 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 zwracany status to 0.

Tak, jest to powłoka i może być używana z dowolnym poleceniem. Zasadniczo zwraca kontrolę natychmiast i umożliwia wykonanie polecenia w tle. Jest to prawie zawsze używane w przypadku, nohupponieważ zazwyczaj chcesz wyjść z powłoki po uruchomieniu polecenia.

mgorven
źródło
4
Widziałem ostatnio kilka dobrych odpowiedzi, a mój mózg zawsze tłumaczy Twoją nazwę użytkownika na McGuyver. Nie jestem pewien, dlaczego czuję potrzebę, aby ci to powiedzieć.
MDMarra
1
@MDMarra wezmę to za komplement ;-)
mgorven
1
@MDMarra Przynajmniej nie sądzisz: „McGruber”
- Przywróć Monikę
7

Użycie ampersand (&) spowoduje uruchomienie polecenia w procesie potomnym (potomkiem bieżącej sesji bash). Jednak po wyjściu z sesji wszystkie procesy potomne zostaną zabite.

użycie nohup + ampersand (&) zrobi to samo, z tą różnicą, że po zakończeniu sesji rodzic procesu potomnego zostanie zmieniony na „1”, czyli proces „init”, dzięki czemu dziecko nie zostanie zabite.

Michel
źródło
3

Tak, to kwestia powłoki - uruchamia polecenie w tle, więc nie musisz czekać na powrót bieżącego polecenia przed wydaniem kolejnych poleceń.

obrabować
źródło