Est-il possible d'utiliser des variables dans crontab -e?

13

Puis-je dire:

MYPATH=/root/scripts  
MYSCRIPT=doit.sh

0 1 * * * $MYPATH/$MYSCRIPT

dans crontab -e?

Est-il possible d'utiliser des variables dans crontab -e?

user19496
la source

Réponses:

15

Oui, vous pouvez définir et utiliser des variables de cette manière. Il y a une limitation (que vous n'avez pas rencontrée dans vos exemples): la chaîne à droite du =signe est interprétée littéralement, avec des espaces de tête supprimés, vous ne pouvez donc pas utiliser de constructions comme FOO=$BAR/qux(par exemple PATH=$HOME/bin:$PATH, ne fera rien d'utile).

Ceci est indiqué dans la documentation, que vous pouvez voir en exécutant

man 5 crontab

(Notez que man crontabmontre la documentation de la crontab commande , dans la section 1 du manuel; vous voulez la documentation du crontab format de fichier , dans la section 5.)

Gilles 'SO- arrête d'être méchant'
la source
7

Je viens de faire un essai, oui c'est possible. Vous pouvez le comprendre avec cet exemple simple, mettez-le dans votre crontab:

FOO = qwerty
* * * * * echo $ FOO> ~ / out

Et vérifiez le fichier ~/out(mis à jour toutes les minutes), il doit contenir "qwerty".

cYrus
la source
2
+1 pour montrer comment le PO peut trouver par lui-même des choses similaires.
Arthaey
Un meilleur exemple utilisera $ FOO dans le script cible.
Acumenus
4

Bien que les crontabs Linux prennent en charge la définition de certaines variables qui contiennent des valeurs littérales, cela ne sert pas à grand chose en plus de condenser un texte long en une représentation plus courte ou de contrôler certaines choses à propos de cron lui-même, comme où envoyer la sortie des e-mails.

La flexibilité consiste à comprendre que la partie commande de l'entrée cron sera passée à /bin/sh -cou le shell défini avec SHELLsur les systèmes utilisant Vixie cron (celui habituellement installé sur les systèmes Linux). Cela signifie que le reste de la ligne de commande est un simple script shell. REMARQUE: réalisez quel shell est utilisé. Sous Linux, /bin/shc'est normalement /bin/bashainsi que la $( ... )commande intégrée fonctionne, mais elle ne le serait pas sur les anciens systèmes où /bin/shseulement comprend à la `place.

Par exemple, j'ai une simple ligne crontab qui archive un fichier MBX de messages enregistrés chaque mois et le compresse. Cela ressemble à ceci:

15 0 1 * *  nf=MailFeed-$( date +\%Y\%m ).mbx && cd Logs && mv MailFeed.mbx $nf && bzip2 -9 $nf

Cela s'exécutera le premier de chaque mois à 00h15, définira un nouveau nom de fichier avec CCYYMM, déplacera le fichier actuel vers un nouveau nom et le compressera. La chose à retenir est qu'un caractère non échappé %(signe de pourcentage) sera traité comme une nouvelle ligne et les données qui le suivront seront envoyées en tant que stdin à la commande précédant le signe de pourcentage. C'est pourquoi la normale date +Y+mest écrite comme date +\%Y\%mci-dessus.

D français
la source
-2

Non, un cronjob ne peut contenir que des éléments cron. N'est-ce pas une option pour créer un script bash et exécuter le script bash via un cronjob?

Maran
la source
1
Vrai sur certains autres unités, mais le cron de Linux prend en charge l'affectation des variables d'environnement.
Gilles 'SO- arrête d'être méchant'