Nella caccia ad un bug che faceva sì che i CGI bloccati non venissero correttamente terminati da Apache nonostante la direttiva Timeout
fosse impostata correttamente, ho scritto un semplicissimo CGI che non facesse niente, allo scopo di capire di cosa stesse succedendo.
Alla fine il problema, almeno su Debian Lenny, era che sulle macchine a 64 bit (e solo su quelle) mod_deflate
manda in SEGFAULT il sottoprocesso di Apache che a sua volta lancia il CGI se questo non ha generato nessuna uscita, con il risultato che poi il segnale di terminazione (che per i curiosi che come me lo han cercato invano nella documentazione, è SIGTERM
) non viene inviato ed il CGI resta in esecuzione, orfano, per l’eternità.
Ma prima di arrivare alla conclusione che il segnale non veniva neanche lanciato, per capire da chi e come arrivasse in condizioni normali (e per essere sicuri che non ci fossero problemi di intercettazione) ho scritto questo piccolo programma, che si limita ad attendere indefinitamente, e scrive su un file (dall’interno del gestore) quello che vede.
Per farlo ho usato versione avanzata dei gestori di segnali (quelli impostati con un campo sa_sigaction
) che prevedono anche il ritorno in un argomento siginfo_t
di una serie di dati relativi al segnale, come il PID del processo che lo ha inviato. Il programma è molto semplice e appena avrò un po’ di tempo lo inserirò come esempio nel testo per questa funzionalità, per chi fosse curioso si trova a questo indirizzo:
http://gapil.truelite.it/sources/browser/trunk/sources/testsignalcgi.c
post interessante