Crontab

Tengo una aplicación vía web la cual se actualiza con otro sistema IBM AS 400 a través de envío de ficheros cada 5 minutos. Luego tengo un proceso cron que se ejecuta cada 5 minutos y este tiene como objetivo lee la información de esos ficheros y la guarda en mi bbdd mysql. El problema está que a veces el proceso cron que se ejecuta cada 5 minutos se encola. Yo lo que quiero controlar es si este proceso cron que se ejecuta cada 5 minutos está en ejecución no se vuelva a ejecutar hasta que termine el otro proceso.

2 Respuestas

Respuesta
1
Podrías hacerlo de 2 formas.
1. El proceso que sube los datos a MySQL y es ejecutado por el CRON podría hacer esto:
a) Verificar que no hay creado un archivo LOCK, si lo hay salirse sin hacer nada.
b) Crear un archivo LOCK indicando que esta en ejecución.
c) Subir los datos a MySQL
d) borrar el archivo LOCK.
2. Si tu proceso se demora más de 5 minutos, y lo tienes en el CRON cada 5 minutos, a mi me parece un error. O mejoras el proceso de cargue de datos, o aumentas el tiempo entre una ejecución y la siguiente.
Nota: Los datos son tan variables, ¿qué necesitas actualizar cada 5 minutos? Mira que de todas formas en 5 minutos no alcanza a hacerlo.
¿Hay alguna razón para que los datos sean subidos a MySQL por un proceso PHP? No puedes utilizar "mysql_import" o incluso un Script SQL, ¿los cuáles son mucho más rápidos?
¿Siempre se demora más de 5 minutos?
De nuevo, si no hay forma de optimizar ese proceso, solo te queda ampliar el tiempo entre las ejecuciones del CRON.
Gracias por tu respuesta.
Veamos voy a explicarme mejor. Yo ejecuto cada 5 minutos esto:
#!/bin/bash
#Cron para ejecutar el proceso php de disofic
#Si existe finentrada.csv ejecutar el proceso de entrada
if [ -f "/home/httpd/html/clientes/control/fichero/ENTRADA/FINENTRADA.CSV" ] ; then
#Proceso de ejecucion del php
wget www.midominio.com/clientes/cron/entrada.php > /dev/null 2> /dev/null
rm entrada.php
fi
#Proceso de salida
#Proceso de ejecucion del php
wget www.dominio.com/clientes/cron/salida.php > /dev/null 2> /dev/null
rm salida.php
Bueno, esta página hacen el proceso de leer el fichero y meterlo en la bbdd y viceversa.
Se actualizan datos clientes, precios, artículos (entrada.php) y pedido vía web (salida.php).
Por mucho que yo controle en esa páginas php no evita que se ejecute tendría que controlarlo desde el cron que es el ejemplo que te he puesto (pienso yo corrígeme si me equivico).
Gracias por todo.
Un Saludo.
El asunto es, si estas usando CRON para ejecutar wget y obligar a una página a ser ejecutada, en lugar de eso puede hacer un script que utilice mysql_import, y si es necesario modifique (pre-procese) tu archivo de datos.
También te decía, es posible usar PHP para correr un script directamente desde el CRON, sin necesidad de pasar por el wget. Para eso esta el programa "php", y pones en tu script "#!/usr/local/bin/php" o donde sea que se encuentre.
Si no puedes ampliar el tiempo a más de 5 minutos en CRON, solo puedes mejorar el procesos para "importar" los datos.
Ahí están las opciones.
Respuesta
1
Ciertamente, se puede controlar esto. Sólo que en tu shell debes preguntar por el proceso, es decir, si tu sabes cual es el ejecutable (shell), entonces con los comendos pues y grep averiguas si esta corriendo y de ser así no lo ejecutarías, de lo contrario permitirías su ejecución. Si quieres detalles escribe nuevamente indicando el nombre del shell para tener un ejemplo más cercano a la realidad tuya.
Gracias por tu respuesta.
Esta son una linea del fichero log del cron:
Oct 10 14:20:00 www CROND[5106]: (apache) CMD (/home/crondisofic/cron.php.disofic 1>/dev/null 2>/dev/null)
Oct 10 14:25:00 www CROND[5191]: (apache) CMD (/home/crondisofic/cron.php.disofic 1>/dev/null 2>/dev/null)
Luego si hago un pues -xau no veo nada porque se ejecuta cada 5 minutos y su tiempo de ejecución normal son segundo con lo que ese proceso solo los veo en los ficheros log.
Gracias por todo.
No veo claramente el shell que trataas de ejecutar, pero voy a tomar como ejemplo uno:
A) Para saber si el shell cron.php.disofic está corriendo:
ps -fea | grep "cron.php.disofic"
if $? -eq 0
Then
Echo "El programa se está ejecutando"
Fi
Una condicionante como ésa te serviría para saber si puedes ejecutar o no el programa. Pero OJO, no debes incluir ésta validación dentro del mismo shell para buscarse a sí mismo, porque entonces el resultado siempre será 0, por lo tanto nunca se ejecutará.
Debes tener un shell aparte para realizar esta validación.
Escríbeme si tienes más dudas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas