2009-05-12 16 views
9

Ho un cron job per eseguire uno script PHP. Il cron è configurato per funzionare ogni minuto, questo viene fatto solo a scopo di test. Lo script PHP in esecuzione è progettato per convertire i video caricati sul server dagli utenti in un formato flash (ad esempio ... .flv). Lo script viene eseguito correttamente quando lo si fa manualmente tramite la riga di comando, tuttavia quando si esegue tramite cron inizia bene ma dopo un minuto si ferma.Un processo cron uccide l'ultima esecuzione di cron?

Sembra che quando viene eseguito il prossimo cron "uccide" l'ultima esecuzione di cron. ho aggiunto la seguente funzione PHP:

ignore_user_abort(true); 

Nella speranza che non sarebbe abortire l'ultima esecuzione, ho provato l'impostazione del cron per eseguire ogni 5 minuti, che funziona bene, ma una conversione di un video può prendere in consegna 5 minuti quindi ho bisogno di capire perché si ferma quando viene eseguito un altro cron.

Qualsiasi aiuto sarebbe apprezzato.

Grazie!

EDIT: mio cron assomiglia:

*/1 * * * * php /path_to_file/convert.php 
+0

Hai controllato il log degli errori di PHP? Hai usato set_time_limit per impostare il limite di tempo su 0? –

+0

Nessun errore, ho anche impostato il limite di tempo su 0. Ho dimenticato di menzionare prima che il mio cron assomiglia a:

 */1 * * * * php /path_to_file/convert.php 
Grazie! –

+0

Sembra che il lavoro cron non sovrascriva su cosa sta funzionando per ultimo, c'era qualcosa di difettoso nel codice PHP. Ho aggiunto un assegno per assicurarmi che esca, tuttavia aggiungendo un file di blocco temporaneo che Sander ha menzionato ha funzionato perfettamente. Grazie! –

risposta

17

Non credo che cron uccida alcun processo. Tuttavia, cron non è veramente adatto per i processi di lunga durata. Quello che potrebbe accadere qui è che il tuo script calpesta tutto se stesso quando viene eseguito più volte. Ad esempio, entrambi i processi PHP potrebbero provare a scrivere sullo stesso file nello stesso momento.

Prima di tutto, assicurati di non solo visualizzare il registro degli errori di php, ma anche di acquisire l'output dal file PHP stesso. Per esempio:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log 

Si potrebbe anche usare un file di lock semplicistico per garantire che convert.php non viene eseguita più volte. Qualcosa di simile:

if (file_exists('/tmp/convert.lock')) { 
    exit(); 
} 

touch('/tmp/convert.lock'); 
// convert here 
unlink('/tmp/convert.lock'); 
+3

cron NON ucciderà un processo. Lo script (o qualcosa che lo script sta chiamando) sta entrando a modo suo. –

3

cron stesso non si fermerà un'istanza precedente di un processo in esecuzione in modo, se c'è un problema, c'è quasi sicuramente qualcosa in PHP farlo. Avrai bisogno di postare quel codice.

1

No, non lo farà. È possibile mantenere in esecuzione un secondo processo creando un file di blocco che lo script verifica per ogni esecuzione. Se il file esiste, non viene eseguito. Questo dovrebbe anche, se appropriato, essere utilizzato insieme ad un tempo massimo di esecuzione in modo tale che un processo non fermi le esecuzioni future indefinitamente. Il file di blocco può essere solo un file di testo in chiaro chiamato /tmp/foo.lock.