Tengo este script bash en el servidor que se ejecuta cada hora, a través de cron. Estaba perfectamente feliz, pero ahora el usuario quiere poder configurar la frecuencia a través de la interfaz web.

No me siento cómodo manipulando la configuración cron mediante programación, pero no estoy seguro de si las otras opciones son mejores.

A mi modo de ver, puedo:

  • Programe un script para que se ejecute una vez por minuto y compruebe si realmente debería ejecutarse "ahora"
  • Olvídese de cron por completo y use un demonio que sea su propio programador. Esto probablemente significa reescribir el script en Python
  • ... o absorba y manipule la configuración cron desde la interfaz web (escrito en python BTW)

¿Qué debo hacer?

EDITAR: para aclarar, la razón principal por la que tengo miedo de manipular cron es porque es básicamente una manipulación de texto sin validación, y si lo estropeo, ninguno de mis otros trabajos cron se ejecutará.

Esto es lo que terminé haciendo:

Siguiendo el consejo de stefanw, agregué la siguiente línea en la parte superior de mi script de bash:

if [ ! `cat /home/username/settings/run.freq` = $1 ]; then
    exit 0
fi

Configuré los siguientes trabajos cron:

0 */2 * * *             /home/username/scripts/publish.sh 2_hours
@hourly                 /home/username/scripts/publish.sh 1_hour
*/30 * * * *            /home/username/scripts/publish.sh 30_minutes
*/10 * * * *            /home/username/scripts/publish.sh 10_minutes

Desde la interfaz web, dejo que el usuario elija entre esas cuatro opciones y, según lo que elija, escribo la cadena 2_hours/1_hour/30_minutes/10_minutes en el archivo en /home/username/settings/run.freq.

No me encanta, pero parece la mejor alternativa.

3
itsadok 16 jul. 2009 a las 12:25

5 respuestas

La mejor respuesta

Ofrezca a sus usuarios algunas opciones razonables como cada minuto, cada 5 minutos, cada media hora ... y traduzca estos valores a una cadena de trabajo cron. Esto es fácil de usar y prohíbe a los usuarios manipular directamente la cadena de trabajo cron.

10
stefanw 16 jul. 2009 a las 08:37

Bueno, algo que uso es una secuencia de comandos principal iniciada cada minuto por cron. Esta comprobación de script tocó los archivos. Si los archivos están allí, el script cron principal inicia una función / subíndice. Solo tiene que tocar un archivo definido y "rm -f" lo editó cuando haya terminado. Tiene los beneficios secundarios de ser una prueba más concurrente si desea otra forma de comenzar a trabajar. Luego puede usar su lenguaje de programación web favorito para manejar la programación de sus usuarios ...

El guión principal se ve así:

[...]

if [ -e "${tag_archive_log_files}" ]; then
    archive_log_files ${params}
    rm -f ${tag_archive_files}
fi

if [ -e "${tag_purge_log_files}" ]; then
    purge_log_files ${params}
    rm -f ${tag_purge_log_files}
fi

[...]
0
neuro 16 jul. 2009 a las 14:36

Podría usar una biblioteca de planificador de Python que ya hace la mayor parte del trabajo:

3
ars 16 jul. 2009 a las 09:04

Encontré un módulo que puede manipular la información cron por mí. Se llama python-crontab, y está disponible con easy_install. Del fuente:

Example Use:

from crontab import CronTab

tab = CronTab()
cron = tab.new(command='/usr/bin/echo')

cron.minute().during(5,50).every(5)
cron.hour().every(4)

cron2 = tab.new(command='/foo/bar',comment='SomeID')
cron2.every_reboot()

list = tab.find('bar')
cron3 = list[0]
cron3.clear()
cron3.minute().every(1)

print unicode(tab.render())

for cron4 in tab.find('echo'):
    print cron4

for cron5 in tab:
    print cron5

tab.remove_all('echo')

t.write()

(Seguí buscando en Google "cron" y no pude encontrar nada. La palabra clave que me faltaba era "crontab").

Ahora estoy decidiendo si usaré esto o simplemente reemplazaré cron por completo con un programador basado en Python.

0
itsadok 20 jul. 2009 a las 06:44

¿Qué pasa con Webmin? Nunca lo he usado yo mismo, pero parece que podría configurar el módulo cron y otorgar permisos al usuario que desea configurar el trabajo.

0
WMR 16 jul. 2009 a las 08:43