Exécuter un cronjob avec différents paramètres chaque jour

12

Je suis programmeur et je ne connais pas grand-chose aux crons, mais je veux savoir si c'est possible.

Disons que j'ai un tableau [option1, option2, option3]et un script que j'exécute dans NodeJS appelé script.js. Je veux exécuter ce script chaque jour à 1 heure du matin. La croncommande de ceci serait:

0 1 * * * node ~/script.js

Eh bien maintenant, la partie délicate, je veux faire pivoter les options chaque jour, donc par exemple lundi je veux courir node ~/script.js option1, le lendemain node ~/script.js option2et ainsi de suite. De plus, je veux pouvoir ajouter / supprimer des options en cas de besoin, mais la rotation doit rester intacte.

Est-ce possible d'une manière ou d'une autre? Je sais que je pourrais le faire également dans le nœud, mais je préfère le faire en dehors du script et laisser le script tel quel.

Saif Bechan
la source
2
Je recommanderais d'écrire ce script par rapport à essayer de faire en sorte que cron le fasse lui-même.
earthmeLon

Réponses:

15

De plus, je veux pouvoir ajouter / supprimer des options en cas de besoin, mais la rotation doit rester intacte.

C'est délicat. Que signifie que la rotation reste intacte après modification de la liste des options? Après tout, vous pourriez être en train de reconstruire complètement la liste, détruisant tout indice sur votre position.

Ce que vous pourriez probablement faire, c'est créer un répertoire avec des fichiers qui représentent vos options (soit via leur nom de fichier, soit leur contenu). Ensuite, chaque fois que le travail cron s'exécute, vous listeriez ce répertoire, en triant les fichiers par heure de dernière modification. Vous prenez l'entrée la plus ancienne, touchce fichier pour changer son heure de modification à l'heure actuelle, puis l'utilisez pour exécuter le script.

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

Si vous le souhaitez, vous pouvez également écrire ceci sur une seule ligne pour cron, bien que cela devienne plus difficile à lire.

Ajouter des options signifie ajouter de nouveaux fichiers au répertoire d'options. Supprimer des options signifie supprimer des fichiers. À tout moment, le fichier le plus ancien est celui à exécuter ensuite, de nouvelles options seront ajoutées à la toute fin du cycle, comme si le venait d'être exécuté. Si vous souhaitez réorganiser les options, vous pouvez les toucher dans l'ordre de votre choix.

MvG
la source
Absolument +1 pour la façon dont vous gérez la séquentialité des options entre les «modifications de liste».
Hagen von Eitzen
Merci pour la réponse, je l'aime et je vais l'utiliser. L'ordre exact de la rotation n'est pas si important lorsque j'en ajoute de nouveaux à la liste. La seule chose qui compte, c'est qu'ils ont tous une course 1-2 chaque semaine chaque semaine, et non deux le même jour.
Saif Bechan du
2
$(ls -rt | head -n1)va bien sûr casser les noms de fichiers qui incluent des sauts de ligne, mais à cet effet, vous pouvez probablement vous en tirer avec "ne faites pas ça".
cjm
20

Disons que vous voulez une option différente pour chaque jour de la semaine. Vous pouvez:

  1. Ayez un travail cron séparé pour ceux-ci:

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

    etc...

  2. Avoir bashfourni les options souhaitées pour vous:

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

    (Je n'ai pas exécuté ce dernier, il pourrait donc avoir besoin de quelques ajustements - mais c'est l'idée générale.)

Konrad Gajewski
la source
2
Merci pour les réponses, mais je pense que ça deviendra compliqué. J'ai vraiment besoin de définir un tableau quelque part, sinon cela ne fonctionnera pas. Je ne peux pas travailler avec echo option1etc, car mes options peuvent varier d'une semaine à l'autre. Je vais juste faire cela dans mon application Node et garder une trace de celle que j'ai exécutée en dernier dans ma base de données.
Saif Bechan
13

Non, je ne peux penser à aucun moyen propre de le faire. Il suffit d'écrire un simple script wrapper shell qui vérifie la date et démarre votre application de nœud avec vos options requises chaque jour.

EEAA
la source
+1 la clé est «pas de voie propre».
Paolo