Abbandonato processo di Apache, quanto tempo ci andare avanti?
Domanda
Quindi, consente di dire che c'è un processo server che richiede troppo tempo. Il cliente lamenta che "tempi fuori".
Correggetemi se sbaglio, ma questo particolare timeout potrebbe avere a che fare con impostazione di timeout di apache, ma non necessariamente. Credo che questo sia il caso, perché quando si verifica la pagina in questione non siamo riusciti a farlo timeout in modo affidabile -. Per lo più il browser sarebbe solo girare per tutto il tempo ci sono voluti
L'impostazione di timeout entrerebbe in vigore se ci fossero problemi con la connessione al client, come descritto in la documentazione . Ma se la connessione andava bene, sarebbe fino al cliente di chiudere la connessione (credo).
ho assunto questo significava anche che, se il cliente ha chiuso il proprio browser, Apache avrebbe colpito il limite di timeout (nel mio caso, 300 secondi), e uccidere il processo. Questo non sembra essere il caso.
Ecco come ho provato:
Ho aggiunto un ciclo while per un certo codice sul server:
too_long = 2000
tstart = time.time()
f = open('/tmp/timeout_test.txt', 'w')
while True:
time.sleep(100)
elapsed = time.time() - tstart
f.write('Loop, %s elapsed\n' % elapsed)
if elapsed > too_long:
break
Ho quindi aprire la pagina Web per lanciare quel ciclo, e corsi netstat sul server:
~$ netstat -np | grep ESTAB | grep apache
tcp 0 0 10.102.123.6:443 10.102.119.101:53519 ESTABLISHED 16534/apache2
tcp 0 0 127.0.0.1:60299 127.0.0.1:5432 ESTABLISHED 16534/apache2
(che sono io a 10.102.119.101, il server è in 10.102.123.6)
Poi ho chiuso il mio browser e reran quella linea netstat:
~% netstat -np | grep ESTAB | grep apache
tcp 0 0 127.0.0.1:60299 127.0.0.1:5432 ESTABLISHED 16534/apache2
La mia connessione è scomparso, ma il server era ancora in loop, ho potuto verificare eseguendo:
~% lsof | grep timeout
apache2 16534 www-data 14w REG 8,1 0 536533 /tmp/timeout_test.txt
che significa il processo apache aveva ancora quel file aperto. Per i successivi 2000 secondi, quando mi sono imbattuto:
~% cat /tmp/timeout_test.txt
Non ho niente. Dopo 2000 secondi la linea netcat ha prodotto nulla, e il file tmp è stato riempito con l'uscita dal ciclo while.
Così sembra che processo Apache fa proprio quello che è stato chiesto di fare, indipendentemente dalla connessione del client? E che cosa è che la connessione di loopback circa?
Soluzione
Una corretta. In un modulo di Apache C è possibile aggiungere un controllo del tipo:
/* r is the 'request_rec' object from apache */
if (r->connection->aborted) {
/* stop processing and return */
}
per verificare che il client è ancora connesso. Probabilmente l'interfaccia Python ha qualcosa di simile.
Per quanto riguarda il collegamento di loopback, è una connessione ad un database PostgreSQL tenuto aperto per tutto il tempo quel ciclo è in esecuzione.