Ejecutar un cronjob con diferentes parámetros cada día


12

Soy programador y no sé mucho sobre crons, pero quiero saber si esto es posible.

Digamos que tengo una matriz [option1, option2, option3]y un script que ejecuté en NodeJS llamado script.js. Quiero ejecutar este script cada día a la 1 de la mañana. El croncomando de esto sería:

0 1 * * * node ~/script.js

Bueno, ahora la parte difícil es que quiero rotar las opciones cada día, así que, por ejemplo, el lunes quiero correr node ~/script.js option1, al día siguiente, node ~/script.js option2etc. Además, quiero poder agregar / eliminar opciones cuando sea necesario, pero la rotación debe permanecer intacta.

¿Es esto posible de alguna manera? Sé que también podría hacer esto dentro del nodo, pero prefiero hacerlo desde fuera del script y dejar el script tal como está.


2
Recomendaría hacer una secuencia de comandos de esto frente a intentar que cron lo haga solo.
earthmeLon

Respuestas:


15

Además, quiero poder agregar / eliminar opciones cuando sea necesario, pero la rotación debe permanecer intacta.

Eso es complicado ¿Qué significa que la rotación permanezca intacta después de la modificación de la lista de opciones? Después de todo, podrías estar reconstruyendo completamente la lista, destruyendo cualquier pista sobre dónde estabas.

Lo que probablemente podría hacer es configurar un directorio con archivos que representen sus opciones (ya sea a través de su nombre de archivo o su contenido). Luego, cada vez que se ejecute el trabajo cron, enumeraría ese directorio, ordenando los archivos por última hora de modificación. Toma la entrada más antigua, touchese archivo para cambiar su hora de modificación a la hora actual, luego la usa para ejecutar el script.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Si lo desea, también puede escribir esto en una sola línea para cron, aunque será más difícil de leer.

Agregar opciones significa agregar nuevos archivos al directorio de opciones. Eliminar opciones significa eliminar archivos. En cualquier momento, el archivo más antiguo es el que se ejecutará a continuación, por lo que se agregarán nuevas opciones al final del ciclo, como si acabaran de ejecutarse. Si desea reordenar las opciones, puede tocarlas en el orden que desee.


Absolutamente +1 por la forma en que administra la secuencialidad de las opciones en "ediciones de lista".
Hagen von Eitzen

Gracias por la respuesta, me gusta y la usaré. El orden exacto de la rotación no es tan importante cuando agrego otros nuevos a la lista. Lo único que importa es que todos corren 1-2 cada semana, y no dos el mismo día.
Saif Bechan

2
$(ls -rt | head -n1)por supuesto, se romperá en los nombres de archivo que incluyen nuevas líneas, pero para este propósito probablemente pueda salirse con la suya simplemente "no haga eso".
cjm

20

Digamos que desea una opción diferente para cada día de la semana. Usted puede:

  1. Tenga un trabajo cron separado para estos:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    etc ...

  2. Tener bashproporcionar las opciones deseadas para usted:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (No ejecuté este último, por lo que podría necesitar algunos ajustes, pero esa es la idea general).


2
Gracias por las respuestas, pero creo que se complicará. Realmente necesito definir una matriz en algún lugar, de lo contrario no funcionará. No puedo trabajar con echo option1etc., porque mis opciones pueden variar de una semana a otra. Solo haré esto en mi aplicación Node y haré un seguimiento de cuál ejecuté por última vez en mi base de datos.
Saif Bechan

13

No, no puedo pensar en una forma limpia de hacer esto. Simplemente escriba una secuencia de comandos de envoltura de shell simple que verifique la fecha e inicie su aplicación de nodo con las opciones requeridas cada día.


+1 la clave es 'no hay manera limpia'.
Paolo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.