Próbowałem uruchomić skrypt powłoki za pomocą sesji zdalnej, która uruchamia proces w tle za pomocą polecenia.
nohup python3 run.py > nohup.out &
Gdy sesja zdalna jest zamknięta, proces zostaje zabity komunikatem:
Złapany sygnał SIGHUP
SIGHUP został złapany, ale nie zdemonizowany. Wyjście
Nie rozumiem; dlaczego proces ginie, gdy został uruchomiony w tle za pomocą nohup & ?
background-process
nohup
Mostwanted Mani
źródło
źródło
tmux
inohup
ignoruję, odrzucam lub wykonuję zadanie w tle.Odpowiedzi:
Twój program w języku Python zostanie cofnięty
nohup
.nohup
ignoruje sygnał zawieszenia,SIG_IGN
a następnie łańcuch ładuje program w tym samym procesie.Twój program Python natychmiast resetuje obsługę sygnału dla sygnału zawieszenia, instalując własną procedurę obsługi sygnału. Ten moduł obsługi sprawdza funkcję wewnętrzną (która nie jest bardzo dobrze zaprojektowana, opierając się na pewnych błędnych założeniach, jeśli ją widziałem) i decyduje, że właściwym działaniem po otrzymaniu sygnału rozłączenia jest wydrukowanie tego komunikatu i wyjdź.
Twój program Python z założenia jest nie do
nohup
zniesienia. W systemie z powłoką kontroli zadania i semantyką sesji / zadania POSIX musisz wykonaćdisown
zadanie, aby powłoka nigdy o tym nie wiedziała, aby wysyłać do niego sygnał zawieszenia.(Nawet to nie wystarcza na systemowych systemach operacyjnych. Ponieważ systematycy zrobili trochę świni z mechanizmu sesji logowania w przestrzeni użytkownika, musisz także upewnić się, że mechanizm systemd, który sygnalizuje zamknięcie systemu, a nie rozłączenie, aby Sesje logowania przy każdym wylogowaniu również się nie uruchamiają.)
Dalsza lektura
źródło
nohup
; nie znalazłem na to lekarstwasetsid nohup python3 run.py > nohup.out &
, setsid rozwiązał ten problem. Czy to właściwe podejście?