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