Używanie systemowej daty / godziny w skrypcie Cron

37

Konfiguruję Cronjob, który utworzy kopię zapasową bazy danych MySQL, którą mam na serwerze, ale nie chcę, aby ciągle nadpisywał ten sam plik. Zamiast tego chcę mieć szereg kopii zapasowych do wyboru, wykonywanych automatycznie. Na przykład:

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

I tak dalej.

Czy jest jakiś sposób na użycie daty i / lub godziny systemowej jako zmiennej w moim Cronjob? Jeśli nie, jakie są Twoje sugestie, aby osiągnąć to samo?

AeroCross
źródło

Odpowiedzi:

45

Możesz spróbować czegoś takiego (jak zauważa Glenn Jackmann poniżej, musisz uciec od wszystkich %postaci):

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

Aby sprawdzić, czy twój konkretny cron uruchomi polecenie crontab jako skrypt sam w sobie, lub jeśli musisz napisać skrypt, który obliczy datę jako ciąg znaków, a następnie uruchomi polecenie mysqldump.

Bez ucieczki przed %„cron” w Redhat Enterprise Linux 5.0 (myślę) ciągle dawał mi błędy o nie znalezieniu pasującego ). Dzieje się tak, ponieważ wszystko po nieskalowanym %jest wysyłane na standardowe wejście polecenia.

Przyjąłbym również zalecenie użycia formatu daty ISO8601 (rrrr-mm-dd, czyli %F), aby porządkować nazwy plików według daty, gdy są sortowane leksykalnie.

Bruce Ediger
źródło
23
Trzeba uważać datena plik cron: niektóre crony (wszystkie?) Traktują %jako koniec polecenia. (więc $()to nie był problem). Musisz uciec od wszystkich znaków procentu: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(ładniej jest użyć formatu daty, który sortuje leksykograficznie)
glenn jackman
2
glenn jackman ma rację: unikanie znaków „%” w powyższym wpisie crontab. Wpis crontab RHEL 5.0 wygląda następująco: 50 11 * * * touch "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Bruce Ediger
Warto zauważyć, że użycie podpowłoki nie działa w zmiennej środowiskowej. Tak więc, DATE=$( date -I )a następnie użycie ${DATE}skutkuje użyciem literału $( date -I )w wierszu polecenia zadania.
Christopher Schultz,
1
Wydaje się, że ucieczka od %jest również konieczna w OpenSuse 42.
kgadek 18.04.16
7

Powinieneś być w stanie używać date.
Rodzajinfo date lub, man dateaby uzyskać szczegółowe informacje.

Może ci się podobać coś takiego (zmień format daty na swoje potrzeby)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
asoundmove
źródło
Ponownie uważaj, aby uciec od wszystkich %znaków w cronie.
glenn jackman
@glenn: Ups, jasne. Jeśli chodzi o porządek leksykograficzny, właśnie dopasowałem format daty OP. Osobiście lubię format ISO, jak ty.
asoundmove
1

Oto skrypt bash, którego użyłem:

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

Pliki wyglądają następująco:

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

Wskaż na to zadanie crona, aby uruchamiało się co noc lub cokolwiek wolisz.


źródło
To działa jak urok. Chociaż nie do końca rozumiem, co się tutaj dzieje. Czy backticks pozwalają na włączenie wyników innych programów lub czegoś takiego? Co z formatowaniem (jak +% F i tym podobne)?
AeroCross,
1
Tak, backticks wykonują podstawianie poleceń, gdzie dane wyjściowe są zastępowane przez same polecenia. Zobacz rozdział 3.4.5. Oto bardziej wyczerpująca lista modyfikatorów łącza
Och, wow, to niesamowity zasób. Wspaniale jest zawsze uczyć się. Dziękuję bardzo za link!
AeroCross
0

Napisz mały skrypt opakowujący, który korzysta z datepolecenia i wywołuje polecenie tworzenia kopii zapasowej.

#!/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
źródło