2009-05-12 21 views
9

Tengo un trabajo cron el ejecuta un script PHP. El cron está configurado para ejecutarse cada minuto, esto se hace solo para fines de prueba. El script PHP que está ejecutando está diseñado para convertir los videos cargados en el servidor por los usuarios a un formato flash (por ejemplo, ... .flv). La secuencia de comandos se ejecuta correctamente cuando se realiza manualmente a través de la línea de comandos, sin embargo, cuando se ejecuta a través de cron, comienza bien, pero después de un minuto simplemente se detiene.¿Una tarea cron mata la última ejecución de cron?

Parece que cuando se ejecuta el siguiente cron "mata" la última ejecución de cron. que añade la siguiente función de PHP:

ignore_user_abort(true); 

Con la esperanza de que no iba a abortar la última ejecución, he probado establecer el cron para ejecutar cada 5 minutos, lo que funciona bien, sin embargo, una conversión de un vídeo puede hacerse cargo de 5 minutos, así que necesito averiguar por qué se detiene cuando se ejecuta otro cron.

Cualquier ayuda sería apreciada.

Gracias!

EDIT: Mi cron se parece a:

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

¿Revisó el registro de errores de PHP? ¿Has usado set_time_limit para establecer el límite de tiempo en 0? –

+0

No hay errores, también configuré el límite de tiempo en 0. Olvidé mencionar anteriormente mi cron se ve así:

 */1 * * * * php /path_to_file/convert.php 
¡Gracias! –

+0

Parece que el trabajo cron no sobrescribe lo que estaba funcionando el último, había algo defectuoso en el código PHP. Agregué un cheque para asegurarme de que salga, sin embargo, agregar un archivo de bloqueo temporal que mencionó Sander funcionó perfectamente. Gracias! –

Respuesta

17

No creo que cron mate ningún proceso. Sin embargo, cron no es realmente adecuado para procesos de larga ejecución. Lo que puede estar sucediendo aquí es que su script se pisotea por completo cuando se ejecuta varias veces. Por ejemplo, ambos procesos PHP pueden estar intentando escribir en el mismo archivo al mismo tiempo.

Primero, asegúrese de no solo buscar en el registro de errores de php, sino también tratar de capturar los resultados del archivo PHP. E.g:

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

También podría usar un archivo de bloqueo simplista para asegurarse de que convert.php no se ejecute varias veces. Algo como:

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

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

cron NO MATARá un proceso. El script (o algo que el guion llama) se está haciendo a su manera. –

3

cron en sí no se detendrá una instancia anterior de un trabajo en ejecución por lo que, si hay un problema, no hay casi ciertamente algo en tu PHP hacerlo. Necesitarás publicar ese código.

1

No, no lo hará. Puede evitar que se ejecute un segundo proceso creando un archivo de bloqueo que el script comprueba en cada ejecución. Si el archivo existe, no se ejecuta. Esto también debería, si es apropiado, usarse junto con un tiempo de ejecución máximo para que un proceso no interrumpa las ejecuciones futuras indefinidamente. El archivo de bloqueo puede ser simplemente un archivo de texto sin formato vacío llamado /tmp/foo.lock.