Utilisation de la date / heure du système dans un script Cron

37

Je suis en train de configurer un Cronjob qui sauvegardera une base de données MySQL présente sur mon serveur, mais je ne veux pas qu'elle continue à écraser le même fichier encore et encore. Au lieu de cela, je veux avoir un tableau de sauvegardes à choisir, fait automatiquement. Par exemple:

## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql

## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql

Etc.

Est-il possible d'utiliser la date et / ou l'heure système comme une sorte de variable dans mon Cronjob? Si non, quelles sont vos suggestions pour accomplir la même chose?

AeroCross
la source

Réponses:

45

Vous pouvez essayer quelque chose comme ceci (comme le note glenn jackmann ci-dessous, vous devez échapper à tous les %personnages):

15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"

Pour voir si votre cron en particulier exécutera la commande hors de crontab en tant que script, ou si vous devez écrire un script qui détermine la date sous forme de chaîne, puis exécutez votre commande mysqldump.

Sans échapper au %"cron" de Redhat Enterprise Linux 5.0 (je pense), je continuais à me donner des erreurs pour ne pas trouver de correspondance ). En effet, tout ce qui suit un non échappé %est envoyé à l’entrée standard de la commande.

Je voudrais également prendre la recommandation d'utiliser le format de date ISO8601 (aaaa-mm-jj, qui est %F) pour que les noms de fichiers soient classés par date lorsqu'ils sont triés lexicalement.

Bruce Ediger
la source
23
Il faut faire attention à l' dateintérieur d'un fichier cronfile: certains crons (tous?) Sont considérés %comme la fin de la commande. (donc ce $()n'était pas le problème). Vous devez échapper à tous les signes de pourcentage: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(plus agréable d'utiliser un format de date qui trie le lexicographe)
glenn jackman
2
Glenn Jackman a raison: échapper les caractères '%' dans l'entrée de la crontab ci-dessus fonctionne. Une entrée de la crontab de RHEL 5.0 ressemble à ceci: 50 11 * * * touch "/tmp/backup.$( date + \% Y - \% m - \% d) .sql"
Bruce Ediger
Il est à noter que l'utilisation d'un sous-shell ne fonctionne pas dans une variable d'environnement. Ainsi, DATE=$( date -I )puis l'utilisation ${DATE}ultérieure entraîne l'utilisation d'un littéral $( date -I )dans la ligne de commande du travail.
Christopher Schultz
1
Il semble que s’échapper de %soit également nécessaire sur OpenSuse 42.
kgadek
7

Vous devriez pouvoir utiliser date.
Type info dateouman date pour plus de détails.

Quelque chose comme ce qui suit pourrait vous convenir (changez le format de la date selon vos besoins)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
se déplacer
la source
Encore une fois, veillez à échapper à tous les %caractères à l'intérieur de cron.
Glenn Jackman
@ glenn: Oups, bien sûr. En ce qui concerne l'ordre lexicographique, je viens de faire correspondre le format de date du PO. Personnellement, j'aime le format ISO, comme vous.
asoundmove
1

Voici le script bash que j'ai utilisé:

#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz

Les fichiers ressemblent à:

backup2011-03-02_15:16:46.sql.gz

Dirigez la tâche cron vers ceci pour qu'elle fonctionne la nuit ou comme vous préférez.


la source
Cela fonctionne comme un charme. Bien que je ne comprenne pas bien ce qui se passe ici. Les backticks permettent-ils d'inclure le résultat d'autres programmes ou quelque chose? Qu'en est-il de la mise en forme (comme +% F et autres)?
AeroCross
1
Yep les backticks effectuent la substitution de commande où la sortie est substituée à la commande elle-même. Reportez-vous à la Section 3.4.5. Voici une liste plus complète des modificateurs pour la liaison de
Oh, wow, c'est une ressource incroyable. C'est génial de continuer à apprendre. Merci beaucoup pour le lien!
AeroCross
0

Ecrivez un petit script qui utilise la datecommande et appelle votre commande de sauvegarde.

#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
 NOW="UNKNOWN_DATE"
 fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
 echo "$0: backup failed with error code $?"
 fi
LawrenceC
la source