Dlaczego proces w tle nie zostaje zabity?

10

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 & ?

Mostwanted Mani
źródło
1
Kiedyś byłem zdezorientowany wszystkimi nieoczekiwanymi zachowaniami kontroli zadań powłoki. Teraz po prostu całkowicie używam tmuxi nohupignoruję, odrzucam lub wykonuję zadanie w tle.
Siyuan Ren,

Odpowiedzi:

10

Twój program w języku Python zostanie cofnięty nohup.

nohupignoruje sygnał zawieszenia, SIG_IGNa 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 nohupzniesienia. W systemie z powłoką kontroli zadania i semantyką sesji / zadania POSIX musisz wykonać disownzadanie, 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

JdeBP
źródło
3
Czy robi to ich program w języku Python, czy też interpreter języka Python (środowisko uruchomieniowe) robi to po cichu za ich plecami?
ilkkachu
Ponadto w systemie Mac OS wylogowanie z sesji ssh zabija zadania powłoki, nawet gdy zaczniesz ich używać nohup; nie znalazłem na to lekarstwa
imhotap
Cóż, jeśli problemem jest procedura obsługi sygnału, OP może po prostu zmienić procedurę obsługi sygnału na procedurę obsługi, która nie zabija procesu. Powinno to działać niezależnie od tego, kto instaluje taką procedurę obsługi sygnałów. Chciałbym dodać o ssh: czasami nawet jeśli proces jest utrzymywany przy życiu, może mieć problemy. Kilka lat temu straciłem sporo czasu, próbując zrozumieć niektóre błędy uprawnień, a ostatecznie winowajcą był Kerberos: kiedy sesja ssh została zamknięta, tokeny wygasły, więc musiałem utworzyć nowe tokeny, aby użyć ich zamiast sesji ssh.
Bakuriu
@JdeBP Próbowałem setsid nohup python3 run.py > nohup.out &, setsid rozwiązał ten problem. Czy to właściwe podejście?
Mostwanted Mani