it-swarm-es.tech

Ejecute un script a través de cron cada dos semanas

He investigado bastante sobre cómo hacer esto, y veo que no hay una forma directa en cron para ejecutar un trabajo, digamos, cada dos jueves.

En este momento, me estoy inclinando hacia la creación de un script que simplemente se ejecutará cada semana, y tocará un archivo de "bandera" cuando se ejecute, y si se ejecuta y el archivo ya está allí, para eliminar el archivo (y no realizar la acción quincenal).

Mi pregunta es, ¿hay alguna otra forma más elegante o más simple de lograr este objetivo de un script bash de acciones que se ejecutan cada dos semanas automáticamente?

¡Gracias!

12
dmkmills
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

Usé bash para hacer mis matemáticas porque soy vago; cambia eso a lo que quieras. Aprovecho que el 1 de enero de 1970 es jueves; para otros días de la semana, tendría que aplicar una compensación. Cron necesita que se hayan escapado los signos de porcentaje.

Comprobación rápida:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

Tenga en cuenta que elegí momentos aleatorios para mostrar que esto funcionará si se ejecuta en cualquier momento el jueves, y elegí fechas que cruzan los límites del año e incluyen meses con 4 y 5 jueves.

Salida:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run
11
Roger Pate

Una forma podría ser usar la utilidad at si está ejecutando Linux. Podría poner esto al final de su script:

at X + 2 weeks -f myscript

donde X es el momento en el que desea ejecutar su script. Para inicializar, simplemente llame a at durante el tiempo que desee ejecutarlo por primera vez y luego la declaración anterior sigue renovando su llamada programada.

5
gvkv

Si puede usar anacron en el sistema, las cosas serán mucho más simples. Para usar anacron debes tenerlo instalado y también debes tener acceso de root. No funciona en sistemas más antiguos (es decir, RHEL 5.x), las versiones anteriores de ancron SOLO se ejecutan al arrancar. Funciona con sistemas más nuevos (es decir, RHEL 6.x).

Con anacron, uno puede programar trabajos de una manera más flexible, p. Ej. ejecutar X trabajo una vez a la semana. También anacron ejecuta trabajos cuando la computadora está disponible, es decir, no tiene que considerar cuando el sistema está funcionando o no.

Para ejecutar un script cada dos semanas, debe agregar una línea similar a la siguiente en/etc/anacrontab:

14 5 myScript script.sh

Eche un vistazo a la página del manual para obtener más detalles.

3
memin

Lo ejecutaría todas las semanas y haría que el script verificara si el número de la semana es un número impar: si es así, salga.

Esto necesitaría pensar un poco más para funcionar de diciembre a enero.

Quizás haga que el script establezca un archivo de marca de "última ejecución exitosa". Cuando se inicia el script, compruebe que el archivo de marca se modificó por última vez hace 14 días.

0
glenn jackman

No estoy seguro de si hay una forma más elegante de definir cada dos semanas, pero esto puede funcionar para usted.

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

Esto lanzará el guión a las 6:00 am el primer y tercer jueves del mes.

0
pferate