2011-07-01 30 views
11

Si escribo crontab -l en la línea de comandos que puedo ver la siguiente línea:¿Cómo iniciar/detener un cronjob usando PHP?

# * * * * * /usr/bin/php /home/user/every_minute_script.php 

Para inicio esta tarea programada, tengo que editar el archivo con crontab -e de comandos, quite el carácter de comentario al principio de la línea, guarde el archivo editado y salga del editor.

To stop este cronjob, los mismos pasos, pero agregando el carácter de comentario al principio de la línea.

Quiero lograr exactamente el mismo efecto utilizando una secuencia de comandos PHP, en lugar de editar manualmente el archivo.

+0

Nota: no está comenzando/deteniendo el trabajo en sí (su modificación no afecta las tareas que ya se están ejecutando), solo está configurando si comenzará la próxima vez o no. – Piskvor

+0

Sí. Tal vez hay una mejor manera de escribir esta pregunta. En lugar de iniciar/detener, ¿tal vez activar/desactivar? –

+0

esto parece un duplicado de http://stackoverflow.com/questions/4421020/use-php-to-create-edit-and-delete-crontab-jobs – ben

Respuesta

10

he hecho un poco de investigación y found in a forum, el siguiente mensaje:

llamada "crontab -e" con la variable de entorno EDITOR ajustado a un php guión. Esa secuencia de comandos puede modificar el archivo y cuando sale de crontab volverá a leer el archivo y la actualización.

Por lo tanto, he intentado algo, y funcionó.Voy a pegar el código de trabajo a continuación:

#!/usr/bin/php 
<?php 

$on = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n"; 
$off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n"; 

$param = isset($argv[1]) ? $argv[1] : ''; 
$filename = isset($argv[2]) ? $argv[2] : ''; 

if ($param == 'activate') 
{ 
    shell_exec('export EDITOR="/home/user/cron.php on"; crontab -e'); 
} 
elseif($param == 'deactivate') 
{ 
    shell_exec('export EDITOR="/home/user/cron.php off"; crontab -e'); 
} 
elseif(in_array($param, array('on', 'off'))) 
{ 
    if (!is_writable($filename)) 
     exit(); 

    $crontab = file($filename); 
    $key = array_search($param == 'on' ? $off : $on, $crontab); 

    if ($key === false) 
     exit(); 

    $crontab[$key] = $param == 'on' ? $on : $off; 
    sleep(1); 
    file_put_contents($filename, implode('', $crontab)); 
} 

exit(); 

?> 

Así las cosas, tenemos un único script llamado cron.php encuentra en /home/user carpeta, dispuesto a ser ejecutable (chmod a+x cron.php) y llamado desde la línea de comandos (PHP-CLI) . Más tarde lo ajustaré para que se ejecute desde la web, que es mi intención.

Uso: ./cron.php activate para habilitar el cronjob y ./cron.php deactivate para deshabilitarlo.

La secuencia de comandos establece la variable de entorno EDITOR correctamente (a sí mismo) y llama al crontab -e, que a su vez llama al EDITOR (que ahora es el mismo script cron.php) pasando la ubicación temporal del archivo crontab como argumento. Luego, se encuentra y cambia la línea de crontab adecuada, y se guarda la versión modificada, sustituyendo el archivo temporal. Cuando la secuencia de comandos se cierra, crontab se actualizará.

Esto hace exactamente lo que yo quería y se ajustaba a mis necesidades.

Las otras respuestas son agradables y pueden ajustarse a diferentes necesidades y escenarios, y quiero agradecer a todos los que contribuyeron.

+0

cuando ejecuto ./cron.php activar estoy obteniendo '? Php: No existe ese archivo o directorio' error – Hunt

+0

@Hunt: asegúrese de que está utilizando rutas de acceso válidas y nombres de archivos ... debe cambiar'/home/user 'para un camino existente –

2

Deja tus parada/arranque condición al inicio del every_minute_script.php

if($condition == false) { 
    exit(); 
} 
+0

Suena bien, y lo pensé. El problema es que necesito que se me envíe por correo la salida del cronjob (no se puede usar/dev/null). Y en mi configuración, incluso con una "salida" en el inicio del script PHP, recibiría un correo electrónico (¡cada minuto!) ... –

+0

@J. Bruni: Lo que hicimos fue usar un wrapper: '* * * * * /x/y/z/blah.sh &>/dev/null'; y blah.sh era un script que ejecutaba el trabajo real, obtenía su resultado y lo enviaba por correo, a menos que no hubiera ningún resultado. – Piskvor

+0

@J. Bruni: ¿pensé que solo había un correo electrónico si había resultados del guión? –

2

Podría colocar algún tipo de lógica en el comienzo de every_minute_script.php que comprueba una bandera para ver si se debe hacer algo? De esa forma, podría girar y luego detenerse rápidamente si no hay trabajo por hacer.

¿O es demasiado ineficiente para sus propósitos?

+0

Acabo de comentar la respuesta de Adam (similar a la tuya). Esta idea es agradable, y tal vez la respuesta final a muchos escenarios. En mi caso, si es posible, prefiero no ejecutar 'every_minute_script.php' en absoluto. –

+0

¿Puede hacer algo en la línea de lo que @Piskvor sugiere, y solo enviar un correo electrónico cuando el script realmente se ejecuta y produce resultados? –

6

Here's un tutorial muy bueno para crear exactamente este tipo de funcionalidad con PHP.

7

En lugar de jugar con crontab mediante programación (que es sutil y rápido para la ira), sugeriría hacer un cheque dentro de su every_minute_script.php:

if (!file_exists('/your/path/run_every_minute_script')) { 
    exit; 
} 

De esta manera, el guión sigue comenzar cada minuto , pero si la condición no se cumple (/your/path/run_every_minute_script no existe), terminará inmediatamente sin procesamiento adicional.

(Por supuesto, se puede sustituir diferentes condiciones allí, por ejemplo, comprobar la base de datos de permiso, etc.)


Si necesita enviar por correo la salida, se puede utilizar un script de envoltorio. Crontab:

* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null 

El guión envoltorio luego ejecuta el trabajo apropiado, recoge su producción y los errores, y si las personas no están vacías, las envía fuera (tenga en cuenta que también se puede hacer el registro de entrada en el interior del guión envoltorio; nos no lo hizo, ya que se basó en la base de datos).

+0

Me gusta esta solución. Mucho más elegante que jugar con crontab. – jahackbeth

Cuestiones relacionadas