2012-10-19 20 views
7

Ho uno script a esecuzione lunga che ogni ora apre un file, stampa su di esso e chiude il file. Recentemente ho riscontrato molto raramente che la stampa non funziona, non perché sto testando lo stato della stampa stessa, ma piuttosto perché mancano voci nel file fino a quando il sistema non viene effettivamente riavviato!cosa potrebbe causare un errore di stampa in perl?

Faccio trap per errori di apertura dei file e scrivo un messaggio a syslog quando ciò accade e non vedo alcun errore aperto, quindi suppongo che possa essere la stampa che sta fallendo. Non sto intrappolando i fallimenti di stampa, che sospetto che la maggior parte delle persone non lo faccia, ma ora aggiornerò quella stampa.

Nel frattempo, la mia domanda è qualcuno sa quali tipi di situazioni potrebbero causare un errore di stampa quando c'è abbondanza di archiviazione su disco e nessuna contesa per un file che è stato aperto correttamente in modalità accodamento?

risposta

7

La memoria potrebbe essere esaurita (ENOMEM) o su un limite di file (E2BIG o SIGXFSZ). Potresti avere un errore I/O vecchio stile (EIO). Si può avere una condizione di competizione se lo script viene eseguito contemporaneamente o se si accede al file tramite NFS. E, naturalmente, potresti avere un errore nell'espressione di cui stamperesti il ​​valore.

Una causa esotica che una volta ho visto è che un guasto del dissipatore di calore della CPU può portare a sprintf fallire spuriemente, causando alcuni risultati sorprendenti, tra cui la scrittura di file di descrizione per i descrittori di file.

Infine, vi ricordo che la stampa scriverà spesso le sue cose in un buffer I/O. Questo significa due cose. (1) È necessario controllare anche il risultato di close(). (2) Se si stampa ma non si chiude immediatamente() o flush(), i dati possono essere memorizzati nel buffer e in realtà non scritti fino a molto più tardi (o non del tutto se il processo dovesse morire in modo orribile).

+0

buona ipotesi, ma ho appena guardato e aveva 67 GB di memoria libera al momento. Ho anche visto che lo stesso script che stava cercando di aggiornare questo file scrive contemporaneamente un file compresso tramite Compress :: Zlib ogni secondo e si è bloccato per 30 secondi prima che la stampa fallisse e si riavvii immediatamente proprio al momento in cui si è verificata la stampa. Quindi sembra che il filesystem sia temporaneamente 'non disponibile'? –

+0

Se il tuo filesystem era temporaneamente 'non disponibile', significa che probabilmente hai un errore del disco rigido, controlla il registro di sistema. – OmnipotentEntity

Problemi correlati