Verwenden des Systemdatums / der Systemzeit in einem Cron-Skript

37

Ich richte einen Cronjob ein, der eine MySQL-Datenbank auf meinem Server sichert, aber ich möchte nicht, dass dieselbe Datei immer wieder überschrieben wird. Stattdessen möchte ich eine Reihe von Sicherungen zur Auswahl haben, die automatisch durchgeführt werden. Beispielsweise:

## 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

Und so weiter.

Kann ich das Systemdatum und / oder die Systemzeit als eine Art Variable in meinem Cronjob verwenden? Wenn nicht, was sind Ihre Vorschläge, um dasselbe zu erreichen?

AeroCross
quelle

Antworten:

45

Sie könnten so etwas versuchen (wie Glenn Jackmann unten bemerkt, müssen Sie alle %Zeichen entkommen ):

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

Um zu sehen, ob Ihr bestimmter Cron den Befehl von crontab als Skript an und für sich ausführt, oder ob Sie ein Skript schreiben müssen, das das Datum als Zeichenfolge berechnet, und dann Ihren Befehl mysqldump ausführen.

Ohne das %zu umgehen, gab mir "cron" unter Redhat Enterprise Linux 5.0 (glaube ich) immer wieder Fehler, weil ich keine passende gefunden habe ). Dies liegt daran, dass alles, was nach einem nicht entkappten Befehl %folgt, an die Standardeingabe des Befehls gesendet wird.

Ich würde auch die Empfehlung annehmen, das ISO8601-Datumsformat (JJJJ-MM-TT %F) zu verwenden, um die Dateinamen nach Datum zu sortieren, wenn sie lexikalisch sortiert sind.

Bruce Ediger
quelle
23
dateSeien Sie vorsichtig mit Cron-Dateien: Einige Cron-Dateien (alle?) Werden %als Ende des Befehls behandelt. (also das $()war nicht das problem). Sie müssen alle Prozentzeichen ... touch "/tmp/$(date +\%Y-\%m-\%d)"
umgehen
2
Glenn Jackman ist richtig: Es funktioniert, wenn die Zeichen '%' im obigen crontab-Eintrag maskiert werden. Ein RHEL 5.0-Crontab-Eintrag sieht folgendermaßen aus: 50 11 * * * Berühre "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Bruce Ediger
Es ist erwähnenswert, dass die Verwendung einer Subshell in einer Umgebungsvariablen nicht funktioniert. So, DATE=$( date -I )und mit dann ${DATE}später auf die Ergebnisse in eine wörtliche Verwendung $( date -I )in der Befehlszeile des Auftrags.
Christopher Schultz
1
Es scheint, dass %es auch auf OpenSuse 42 notwendig ist , von zu flüchten .
kgadek
7

Sie sollten verwenden können date.
Typ info dateoder man datefür Details.

Folgendes könnte zu Ihnen passen (passen Sie das Datumsformat an Ihre Bedürfnisse an)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
asoundmove
quelle
Achten Sie auch hier darauf, dass Sie alle %Zeichen in cron vermeiden.
Glenn Jackman
@glenn: Ups, sicher. In Bezug auf die lexikografische Reihenfolge habe ich nur das Datumsformat des OP angepasst. Ich persönlich mag das ISO-Format, wie Sie.
Asoundmove
1

Hier ist das Bash-Skript, das ich verwendet habe:

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

Dateien sehen aus wie:

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

Richten Sie den Cron-Job darauf, dass er nachts ausgeführt wird oder was auch immer Sie bevorzugen.


quelle
Das wirkt wie ein Zauber. Obwohl ich nicht ganz verstehe, was hier passiert. Ermöglichen die Backticks die Einbeziehung der Ausgabe anderer Programme oder ähnliches? Was ist mit der Formatierung (wie +% F und so)?
AeroCross
1
Ja, die Backticks führen eine Befehlssubstitution durch, wobei die Ausgabe den Befehl selbst ersetzt. Siehe Abschnitt 3.4.5 Hier ist eine umfassende Liste von Modifikatoren für die Datenverbindung
Oh, wow, das ist eine erstaunliche Ressource. Es ist toll, immer weiter zu lernen. Vielen Dank für den Link!
AeroCross
0

Schreiben Sie ein kleines Wrapper-Skript, das den dateBefehl verwendet und Ihren Sicherungsbefehl aufruft.

#!/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
quelle