Czy zadanie umieszczone w tle będzie kontynuowane po zamknięciu sesji SSH?

7

Mam instancję AWS i tam mam kilka zadań, które muszę wykonać, co zajmie trochę czasu.

Jeśli uruchomię je przed dojazdem do / z pracy (np. wget <someStuff>), A następnie przekażę je do tła CtrlZ», bgaby sprawdzić, czy zaczyna się poprawnie), a następnie zakończ moją sesję SSH, czy polecenie wget będzie działać w tle?

Czy to kończy się wraz z zamknięciem sesji?

MHibbin
źródło

Odpowiedzi:

10

Samo umieszczenie go w tle nie spowoduje pozostania w tle po zakończeniu sesji ssh.

Tło to po prostu odłącza stdinpotok od konsoli. Proces ten jest nadal potomkiem procesu powłoki, np bash. Standardowa procedura w systemie Linux / UNIX polega na tym, że zakończenie procesu powłoki rodzicielskiej z wdziękiem powoduje, że wszystkie procesy potomne otrzymują SIGHUPsygnał. Prawie wszystkie standardowe procesy przetworzą ten sygnał jako żądanie zakończenia procesu, chociaż proces może zignorować sygnał SIGHUP i kontynuować działanie. Może również zrobić coś zupełnie innego, na przykład włączyć kuchenkę mikrofalową lub zrobić łazik na Księżycu, wiercić w ziemi, uruchomić samochód lub usunąć wszystkie pliki z systemu. To sygnał, co oznacza, że ​​jest to tylko rodzaj polecenia doradczego wysłanego do procesu. Dzięki temu proces może zrobić, co chce.

Oto, co musisz zrozumieć: ponieważ przetwarzanie SIGHUP jest równoznaczne z powiedzeniem „zakończ program teraz”, coś może z łatwością zignorować to „miłe żądanie” i kontynuować. Istnieje więc kilka dedykowanych programów, które zostały zaprojektowane specjalnie w celu umożliwienia kontynuowania procesu nawet po zakończeniu powłoki. Kiedy połączenie SSH rozłącza, nawiasem mówiąc, proces skorupa ma zakończyć jako część sekwencji wylogowania.

GNU screenjest jednym z takich poleceń; nohupjest inny. screenjest ogólnie bardziej elastyczny i bardzo przydatny do tego konkretnego zadania. bgnie jest odpowiednie, ponieważ proces potomny „honoruje” SIGHUP, jeśli nie jest zawinięty w proces, który ma na celu ignorowanie SIGHUP, np screen. nohupjest najbardziej podstawowym procesem ignorującym SIGHUP, ponieważ jest to w zasadzie jego jedyna funkcjonalność, inna niż zapisywanie wyniku procesu potomnego w pliku.

Zobacz także to pytanie, które jest w zasadzie dokładnym duplikatem, ale dotyczy ServerFault .

allquixotic
źródło
4
Warto również sprawdzićdisown
slhck,
3

Wget w szczególności będzie automatycznie kontynuował działanie w tle, jeśli zamkniesz sesję SSH, bez potrzeby wykonywania dalszych działań. Tworzy nawet wget-logplik, jakbyś zaczął go od -bprzełącznika.

Zasadniczo programy, które są zatrzymane lub działają w tle, zamykają się po zamknięciu sesji SSH.

Dennis
źródło
Ciekawy. Nie wiedziałem, że to wgetignoruje SIGHUP.
allquixotic