Comment définir une variable DATE à utiliser dans un journal pour la sortie crontab?

10

Je jouais avec des variations de date comme

DATE = $(date)

mais ça n'a pas marché non plus

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

cela sort juste le texte tel quel ...

Je veux créer une entrée de journal dans crontab.log avec un horodatage à chaque mise à jour

Comment puis-je faire cela sur CentOS 6?

MISE À JOUR

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

rendu seulement [CRON] et RIEN quand je l'ai essayé = /

qodeninja
la source

Réponses:

28

Cron n'est pas un shell - il n'analyse pas les commandes de la même manière qu'un shell. En tant que telle, votre variable est affectée comme s'il s'agissait de texte statique.

Je connais trois solutions à ce problème:

Option 1: utilisez un script shell pour générer votre commande, incluez les variables et la logique que vous souhaitez - et appelez ce script shell depuis cron.

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Option 2: incluez la commande date directement dans votre commande et, puisque la commande entière est passée au shell, la date sera traitée et remplacée par une date réelle.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Option 3: définissez la variable de chaîne dans cron et transmettez-la à votre commande à traiter (remarque - les signes de pourcentage n'ont pas besoin d'être échappés et la variable elle-même est enveloppée dans $ () pour l'exécuter dans un shell séparé - les astuces devraient fonctionner de la même manière):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(Dans tous les cas ci-dessus, vous pouvez bien sûr utiliser une variable pour le chemin du journal, au lieu de le "coder en dur".)

cyberx86
la source
1
merci pour les bons commentaires +1, j'ai essayé de l'ajouter à la crontab mais cela n'a pas fonctionné = / cela ne rend jamais DATEVAR
qodeninja
Je viens de le faire sur un système compatible RHEL / CentOS6 et cela a donné le résultat attendu (c'est-à-dire ajouté une nouvelle ligne au fichier avec la date). Quelle option (parmi les 3 ci-dessus) avez-vous essayée, et quel a été le résultat - soyez précis - et y a-t-il eu une erreur dans / var / log / cron? (si vous utilisez l'option de script, a) n'oubliez pas de chmod + x et b) essayez-le d'abord (c'est-à-dire pas via cron))
cyberx86
1
option 3 =], j'avais essayé de le faire avant mais ça n'a pas été rendu. Mais maintenant, je remarque que vous avez fait quelque chose de lil dif. pourquoi avez-vous doublé le $ ($ (DATE))? voir ma mise à jour ci
qodeninja
1
Vous avez une faute de frappe dans la mise à jour que vous avez ajoutée - ce n'est $($DATEVAR)pas le cas $($(DATEVAR)). Pensez-y de cette façon - $()c'est-à-dire le support externe - lance un nouveau shell pour traiter tout ce qui se trouve entre les crochets. Dans ce cas, la variable $ DATEVAR est définie sur une chaîne et transmise au shell. $(DATEVAR)n'est rien - parce que DATEVARn'est rien (c'est-à-dire qu'il manque un $ pour l'identifier comme variable). Vous pouvez également utiliser des astuces $DATEVARpour obtenir le même résultat
cyberx86
C'est suffisant. l'a mis à jour. essayons ce mauvais garçon! - Hazaaah! cela a fonctionné lol
qodeninja