Cron ejecuta el trabajo cada 15 segundos

18

¿Podría aconsejarme qué escribir crontabpara que ejecute algún trabajo (para las pruebas que usaré /usr/bin/chromium-browser) cada 15 segundos?

xralf
fuente
En lugar de crontab, confíe en algún otro sistema de gestión de eventos, por ejemplo: el módulo every.pm de Perl lo ayudará a hacer esto.
Nikhil Mulley

Respuestas:

27

No puede ir por debajo de un minuto de granularidad con cron. Lo que puede hacer es, cada minuto, ejecutar un script que ejecute su trabajo, espere 15 segundos y se repita. La siguiente línea crontab comenzará some_jobcada 15 segundos.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Este script supone que el trabajo nunca tomará más de 15 segundos. El siguiente script un poco más complejo se encarga de no ejecutar la siguiente instancia si uno tardó demasiado en ejecutarse. Se basa en la datecompatibilidad con el %sformato (por ejemplo, GNU o Busybox, por lo que estará bien en Linux). Si lo coloca directamente en un crontab, tenga en cuenta que los %caracteres deben escribirse como \%en una línea crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Sin embargo, notaré que si necesita ejecutar un trabajo cada 15 segundos, cron es probablemente el enfoque equivocado. Aunque los unices son buenos con procesos de corta duración, la sobrecarga de iniciar un programa cada 15 segundos puede no ser insignificante (dependiendo de lo exigente que sea el programa). ¿No puede ejecutar su aplicación todo el tiempo y hacer que ejecute su tarea cada 15 segundos?

Gilles 'SO- deja de ser malvado'
fuente
también podría ser: para i in 1 2 3 4 ; do some_job & sleep 15; done(la última suspensión no afectará la próxima ejecución), pero la forma en que lo haga probablemente sea mejor para el momento del correo saliente de cronjob (enviado justo después del último some_job, intead de 15 segundos más tarde en mi variante)
Olivier Dulac
13

Enfoque diferente a los demás: ejecute 4 cronjobs, cada uno escalonado por 15 segundos:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Para evitar que el trabajo interfiera consigo mismo, limitamos su tiempo de ejecución a 15 segundos a través de GNU coreutils ' timeoutpara cada trabajo. Sin embargo, tenga en cuenta que si el trabajo no sale correctamente inmediatamente después de los 15 años, aún puede terminar con problemas. Consulte el manual de comandos para obtener detalles sobre cómo resolver eso si se convierte en un problema. También tenga en cuenta que si el comando tarda más de 15 segundos y el tiempo de espera lo mata, obtendrá un estado de salida distinto de cero que activará un cronjob-email.

Oteo
fuente
Brillante, aunque repetitivo.
Mike Kormendy el
1
Agradable. Si un proceso dura mucho, probablemente el siguiente proceso también termine en un núcleo diferente. No estoy seguro de si puede establecer deliberadamente una afinidad central para los trabajos de Cron, pero eso podría mejorar aún más este enfoque.
Tim
@Tim buen punto. Abordé eso un poco en una edición.
Oteo
2

En resumen, cron no es tan granular con el tiempo. El período más corto que obtendrá es de 1 min.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Sin embargo, podría escribir un script que se ejecute cada 15 segundos ...

rfelsburg
fuente
Tengo una línea * * * * * /usr/bin/chromium-browseren crontab. Según el manual, debe ejecutarse cada minuto, pero no se ejecuta nada.
xralf
¿Es difícil escribir un guión así? ¿Debo hacer otra pregunta o podría escribirse aquí?
xralf
Los trabajos de Cron no tienen una terminal, por lo que esperaría que el navegador fallara. Puede hacerlo en silencio.
BillThor
Mis registros cron se encuentran en / var / log / cron para derivados de redhat, es decir. fedora, centos, etc. También puede ayudarlo describir exactamente lo que está tratando de hacer para que las personas tengan una idea completa de lo que está sucediendo.
rfelsburg
1

En tu crontab:

* * * *  /usr/bin/chromium-browser_starter

Luego en /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait
anfetamaquina
fuente
Cuando escribo ps aux | grep chromdespués de un minuto, no puedo ver el navegador Chrome.
xralf
@xralf: el script solo se ejecuta durante unos segundos como máximo. Intenta grepping por sleep.
anfetamáquinas