Kiedy potrzebujesz „nohup”, jeśli już używasz „&”?


26

Po pierwsze to pytanie jest powiązane, ale zdecydowanie nie to samo, co to bardzo miłe pytanie:

Różnica między nohup, disown i &

Chcę coś zrozumieć: kiedy to robię „&”, rozwidlam się, prawda?

Czy kiedykolwiek warto robić „nohup ...” czy jest to po prostu wystarczające?

Czy ktoś mógłby pokazać przypadek, w którym używałbyś „&” i nadal chciałby używać „nohup”?


1
Czy przeczytałeś zaakceptowaną odpowiedź i jej wątek komentarza? Wyjaśniają, co nohuprobi. Którą część pomyliłeś?
Gilles „SO- przestań być zły”

3
@Gilles: może to być dla ciebie oczywiste , ponieważ znasz te rzeczy (widziałeś swojego przedstawiciela) ... Jednak na początek zaakceptowana odpowiedź w linku, który zamieściłem , nie mówi ani słowa o używaniu zarówno nohup, jak i „&” ... Jestem prawie pewien, że moje pytanie jest wystarczająco jasne i wystarczająco różne od drugiego, i wydaje się, że dwie świetne odpowiedzi tutaj; ) Czy naprawdę sugerujesz, że wziąłem ból, aby połączyć się z innym pytaniem, ale bez przeczytania zaakceptowanej odpowiedzi !?
Cedric Martin

Odpowiedzi:


32

Po pierwsze, za każdym razem, gdy wykonujesz polecenie, powłoka rozwidla nowy proces, bez względu na to, czy go uruchomisz, &czy nie. &oznacza tylko, że używasz go w tle.

Uwaga: nie jest to zbyt dokładne. Niektóre polecenia, takie jak cdfunkcje powłoki, zwykle nie rozwidlają nowego procesu. type cmdzwykle powie ci, czy cmdjest to polecenie zewnętrzne, czy funkcja powłoki. type typemówi ci, że typesama jest funkcją powłoki.

nohupto coś innego. Informuje nowy proces o zignorowaniu SIGHUP. Jest to sygnał wysyłany przez jądro, gdy powłoka nadrzędna jest zamknięta.

Aby odpowiedzieć na twoje pytanie, wykonaj następujące czynności:

  1. uruchom emacs & (domyślnie powinien działać w osobnym oknie X) .
  2. w powłoce nadrzędnej uruchom exit.

Zauważysz, że emacsokno zostało zabite, mimo że działa w tle. Jest to zachowanie domyślne i nohupsłuży ono właśnie do jego modyfikacji.

Uruchamianie zadania w tle (z &lub bg, założę się, że inne powłoki również mają inne składnie) jest funkcją powłoki, wynikającą ze zdolności współczesnych systemów do wielozadaniowości. Zamiast rozwidlone nową instancję powłoki dla każdego programu chcesz uruchomić, nowoczesne muszli ( bash, zsh, ksh, ...) będzie miał możliwość zarządzania listę programów (lub pracy ). Tylko jeden z nich może znajdować się na pierwszym planie , co oznacza, że ​​skupia się na powłoce. Chciałbym, aby ktoś mógł bardziej rozwinąć różnice między procesem działającym na pierwszym planie a drugim w tle (głównym jest dostęp do stdin/ stdout).

W każdym razie nie wpływa to na reakcję procesu potomnego SIGHUP. nohuprobi.


+1 dla was obojga za świetne odpowiedzi ... Ale wciąż jestem zdezorientowany ... Próbowałem tego przed odpowiedzią na moje pytanie: może moja (bardzo stara) konfiguracja Debiana Linux nie jest poprawnie skonfigurowana, ale jeśli "emacs & ”, a następnie wpisz„ exit ”, wychodzi tylko mój xterm: emacs zostaje tam.
Cedric Martin

Emacs jest na tyle skomplikowany, że sam poradzi sobie z SIGHUP. Tylko domyślnie przetwarza wyjście na SIGHUP. Wiele programów „demonicznych”, takich jak ntpd lub inetd, będzie ponownie czytać swoją konfigurację w SIGHUP zamiast wychodzić. Sam jestem vimem, więc nie mam dużego doświadczenia z żadnym emacsem.
Bruce Ediger

3
W emacsie nie ma nic specjalnego. Powłoka zazwyczaj wysyła SIGHUPdo procesów potomnych, gdy sama powłoka odbiera SIGHUP, a nie kiedy normalnie kończy działanie. bash ma opcję, huponexitktóra powoduje, że wysyła SIGHUPdo dzieci po wyjściu, ale domyślnie nie jest włączona. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

Witaj. przede wszystkim świetne wyjaśnienie. Próbowałem zweryfikować twoją tezę, uruchamiając proces &i zamykając moją powłokę, uruchamiając exit. Proces jest nadal uruchomiony. Wszelkie pomysły, dlaczego nie został zabity? A może coś tu brakuje?
Ali Yılmaz,

Jakiego procesu używasz?
rahmu

16

Czy to jest kiedykolwiek przydatne nohup ... &? Tak. Jeśli po prostu uruchomisz proces „w tle” &, nowy proces nadal będzie miał członkostwo w „grupie procesów” oryginalnej powłoki. Jeśli ta powłoka lub grupa procesów otrzyma określone sygnały (na przykład SIGHUP), domyślnie wychodzą. Oznacza to, że jeśli uruchomisz proces z &powłoki uruchomionej przez xterm, rxvt lub inny emulator terminalu okienkowego, po zamknięciu okna proces w tle zostanie ZWIĘKSZONY. Większość swobodnie napisanego kodu nie obsługuje SIGHUP, a zatem kończy działanie.

Jeśli to zrobisz nohup ... &, nohuppolecenie ustawi SIGHUP na ignorowane, a następnie wykona polecenie. To nowo wykonane polecenie zachowuje nohupkonfigurację maski sygnału , chyba że polecenie samo obsługuje obsługę sygnału. Jeśli zamkniesz xterm, rxvt lub cokolwiek, jądro dostarcza SIGHUP do procesu polecenia, który jest ignorowany. Nadal działa.

Wykonanie nohuppolecenia pozwala na kontynuowanie działania po zamknięciu xterm lub wylogowaniu.


Przepraszam - straciłeś mnie. Czy mówisz, że używanie &z nohuppowoduje, że polecenie działa w pewnych przypadkach, w których użycie tylko nohupnie byłoby? To wydaje się kolidować z odpowiedzią tutaj: unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB - „&” wykonuje zwykłe wywołania systemowe fork / set Things / exec, aby umieścić polecenie „w tle”. Oznacza to, że polecenie, które nie działa, działa asynchronicznie. nohupRobi pewne rzeczy przed exec()wywołania systemowego, aby rozwidlony proces ignorować pewne sygnały. Tak więc „&” pozwoli na uruchomienie polecenia w pewnych okolicznościach, których zwykły stary nohupnie zrobiłby. Jak zamknięcie xtermu związanego z powłoką, która zrobiła nohup, lub wylogowanie.
Bruce Ediger,

-1

jeśli uruchomisz program w tle (z przyrostkiem &) w systemie operacyjnym Linux i wylogujesz się, nawet po tym będzie on działał: wypróbuj:

  ping google.com > ping_result  &

Po ponownym zalogowaniu sprawdź liczbę wierszy w pliku wyjściowym, ping_resultktóry będzie się zwiększał, oznacza to, że nadal działa, ale powiedziano mu, że zostanie zamknięty. jakie jest użycie nohuppolecenia.

inny scenariusz ==> jak podano powyżej dla nohup emac &->, który powinien nadal emacdziałać po wylogowaniu z systemu, ale nie pokazuje się po ponownym zalogowaniu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.