Menggunakan tanggal / waktu sistem dalam Cron Script


37

Saya menyiapkan Cronjob yang akan mencadangkan database MySQL yang saya miliki di server saya, tetapi saya tidak ingin terus menimpa file yang sama berulang kali. Sebagai gantinya, saya ingin memiliki serangkaian cadangan untuk dipilih, dilakukan secara otomatis. Sebagai contoh:

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

Dan seterusnya.

Apakah ada cara saya dapat menggunakan tanggal dan / atau waktu sistem sebagai semacam variabel dalam Cronjob saya? Jika tidak, apa saran Anda untuk mencapai hal yang sama?

Jawaban:


45

Anda dapat mencoba sesuatu seperti ini (seperti catatan glenn jackmann di bawah ini, Anda harus keluar dari semua %karakter):

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

Untuk melihat apakah cron khusus Anda akan menjalankan perintah dari crontab sebagai skrip sendiri, atau jika Anda perlu menulis skrip yang menghitung tanggal sebagai string, dan kemudian jalankan perintah mysqldump Anda.

Tanpa melarikan diri %, "cron" di Redhat Enterprise Linux 5.0 (saya pikir) terus memberi saya kesalahan tentang tidak menemukan yang cocok ). Ini karena semuanya setelah unescaped %dikirim ke input standar dari perintah.

Saya juga akan mengambil rekomendasi untuk menggunakan format tanggal ISO8601 (yyyy-mm-dd, yang %F) untuk membuat nama file urutan berdasarkan tanggal ketika diurutkan secara leksikal.


23
Harus hati-hati dengan datedi dalam cronfile: beberapa crons (semua?) Memperlakukan %sebagai akhir dari perintah. (jadi $()bukan masalahnya). Anda harus keluar dari semua tanda persen: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(lebih baik menggunakan format tanggal yang agak leksikografis)
glenn jackman

2
glenn jackman benar: keluar dari karakter '%' di entri crontab di atas berfungsi. Entri crontab RHEL 5.0 terlihat seperti ini: 50 11 * * * sentuh "/tmp/backup.$(tanggal + \% Y - \% m - \% d) .sql"
Bruce Ediger

Perlu dicatat bahwa menggunakan subkulit tidak berfungsi dalam variabel lingkungan. Jadi, DATE=$( date -I )dan kemudian menggunakan ${DATE}hasil selanjutnya dalam menggunakan literal $( date -I )di baris perintah pekerjaan.
Christopher Schultz

1
Tampaknya melarikan diri %juga diperlukan pada OpenSuse 42.
kgadek

7

Anda harus bisa menggunakannya date.
Ketik info dateatau man dateuntuk detail.

Sesuatu seperti yang berikut ini mungkin cocok untuk Anda (ubah format tanggal sesuai kebutuhan Anda)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension

Sekali lagi, berhati-hatilah untuk menghindari semua %karakter di dalam cron.
glenn jackman

@glenn: Ups, tentu saja. Mengenai urutan leksikografis, saya hanya mencocokkan format tanggal OP. Saya pribadi suka format ISO, seperti Anda.
asoundmove


1

Inilah skrip bash yang saya gunakan:

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

File terlihat seperti:

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

Arahkan tugas cron untuk menjalankannya setiap malam atau apa pun yang Anda inginkan.


Ini bekerja seperti pesona. Meskipun, saya tidak begitu mengerti apa yang terjadi di sini. Apakah backticks memungkinkan masuknya output dari program lain atau sesuatu? Bagaimana dengan pemformatan (seperti +% F dan semacamnya)?
AeroCross

1
Yap backticks melakukan substitusi perintah di mana output diganti untuk perintah itu sendiri. Lihat Bagian 3.4.5 Berikut ini adalah daftar pengubah yang lebih komprehensif untuk tautan

Oh, wow, itu sumber yang luar biasa. Sangat menyenangkan untuk selalu belajar. Terima kasih banyak untuk tautannya!
AeroCross

0

Tulis skrip pembungkus kecil yang menggunakan dateperintah dan memanggil perintah cadangan Anda.

#!/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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.