[Linuxtrent] Re: python avvio servizi e controllo pid

  • From: Matteo Ianeselli <m.ianeselli@xxxxxxxxxxx>
  • To: Mailing list linuxtrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: Wed, 06 Apr 2005 21:33:02 +0200

Il giorno mer, 06-04-2005 alle 15:39 +0200, Claudio ha scritto:


> Il problema è che quando avvio un processo in tale modo mi ritrovo si
> ad avere il pid... ma il processo risulta in stato defunct.
> 
> esempio: pid = os.spawnl(os.P_NOWAIT, '/usr/sbin/smbd',' ')
> ottendo il pid 3694
> 
> ma la situazione dei processi è la seguente...
> 
> 3694 pts/2    00:00:00 smbd <defunct>
>  3695 ?        00:00:00 smbd
>  3696 ?        00:00:00 smbd
> 
> Sicuramente mi sfugge qualcosa... avete qualche suggerimento?


Molto in breve: perché smbd è un demone, il processo che tu avvii si
forka a sua volta e poi termina subito, tu ricevi SIGCHLD ma non fai
wait(2) per cui ti ritrovi con uno zombie (che ti resta finché il padre
non termina a sua volta, o finché non fa wait(2) di suo).



Meno in breve: un demone, per essere veramente tale, deve:

1) chiudere tutti i file descriptor aperti che eredita (quantomeno
   stdin, stdout e stderr)

2) cambiare la sua directory corrente in '/' (non indispensabile, ma
   è buona educazione, altrimenti poi non si riesce più a smontare
   il volume da cui era stato avviato)

3) entrare a far parte di un nuovo process group e staccarsi dal
   terminale controllante.

Per fare la (3) correttamente, il processo deve necessariamente
fork(2)are: poi il figlio va avanti (finalmente come demone), mentre il
padre termina.

Dopodiché è noto che quando un processo termina, di esso rimane il solo
exit code, che il padre (il tuo script Python) deve andare a recuperare
(via wait(2) o varianti). E finchè il padre non lo recupera, il figlio
rimane zombie (i.e. rimane elencato nella lista dei processi, ma di esso
rimane il solo exit code). Quando il padre termina, il figlio zombie
viene adottato da init (pid 1), che di quando in quando fa una wait(2)
che permette allo zombie di andare verso pascoli più verdi.






> 
> Grazie in anticipo
-- 
  |   \    \  | ___|_  |_  |  ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /   Verba volant, scripta
 _|_/  _\_|  _|____|___|___|  manent, data corrupted


--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: