2011-04-24 6 views
20

Zastanawiam się, czy to jest poprawny sposób na wykonanie procesu systemowego i odłączenie od rodzica, chociaż pozwala rodzicowi wyjść bez tworzenia zombie i/lub zabicia dziecka proces. Jestem obecnie za pomocą modułu subprocess i robi to ...Python odradza się podprocesowi podrzędnemu, oddziela i kończy

os.setsid() 
os.umask(0) 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd=self.home, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

os.setsid() zmienia grupę procesów, które moim zdaniem jest to, co pozwala kontynuować proces uruchomiony, gdy jest wyjść macierzystych, ponieważ nie jest już należy do tej samej grupy procesów.

Czy to jest poprawne i czy jest to niezawodny sposób na wykonanie tego?

Zasadniczo mam narzędzie do zdalnego sterowania, które komunikuje się za pośrednictwem gniazd i pozwala na zdalne uruchamianie procesów, ale muszę się upewnić, że w przypadku zgonu pilota, uruchomione procesy będą nadal działać bez zakłóceń.

Czytałem o podwójnych widłach i nie jestem pewien, czy jest to konieczne i/lub podproces.POpen close_fds w jakiś sposób się tym zajmuje, a wszystko, czego potrzeba, to zmienić grupę procesów?

Dzięki.

Ilya

+0

Zajrzyj na http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/ http://www.python.org/dev/peps/pep- 3143/# referencja-implementacja – sehe

Odpowiedz

5

popen na Uniksie jest done using fork. Oznacza to, że będziesz bezpieczny z:

  1. uruchomieniu Popen w procesie macierzystym
  2. natychmiast zakończyć proces nadrzędny

Po wyjściu procesu rodzic, proces dziecko jest dziedziczona przez init proces (launchd na OSX) i nadal będzie działał w tle.

nie są potrzebne Pierwsze dwie linie programu Pythona, to doskonale działa:

import os, time 
import subprocess 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd="/", 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

czytałem o podwójnych widelce i nie wiem, czy jest to konieczne

ten byłby potrzebny, jeśli proces rodzicielski nadal działa i musisz chronić swoje dzieci przed śmiercią z rodzicem. This answer pokazuje, jak to zrobić.

Jak dwukrotnie widelec działa:

  1. stworzyć dziecku poprzez os.fork()
  2. w niniejszym zaproszeniu dziecka Popen() który uruchamia długi uruchomiony proces
  3. zjazd dziecko: Popen proces jest dziedziczona przez init i tras w tle

Dlaczego rodzic musi natychmiast wyjść? Co się stanie, jeśli nie wyjdzie natychmiast?

Jeśli zostawisz rodzic uruchomiony, a użytkownik zatrzyma proces, np. przez ctrl-C (SIGINT) lub ctrl-\ (SIGQUIT) następnie zabiłoby proces macierzysty i proces Popen.

Co się stanie, jeśli opuści jedną sekundę po rozwidleniu?

Następnie, podczas tego okresu 1s Twój proces Popen jest podatny na ctrl-c itp Jeśli musisz być w 100% pewien, następnie użyć podwójnego rozwidlone.

+0

Czy możesz wyjaśnić, dlaczego rodzic musi natychmiast wyjść? Co się stanie, jeśli nie wyjdzie natychmiast? Co również stanowi "natychmiast"? Co się stanie, jeśli opuści jedną sekundę po rozwidleniu? – Hubro

+0

@Hubro: Dodałem odpowiedzi na twoje pytanie do powyższej odpowiedzi, a także wyjaśniłem kilka rzeczy, które zostały źle wyjaśnione. – hansaplast

+0

Ten proces zawiesza się, jeśli proces potomny umieszcza dużą wydajność w potoku. Ustaw 'stdout = None', jeśli nie chcesz komunikować się z procesem. Aby uzyskać więcej informacji, patrz: https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/ –

Powiązane problemy