Bir Cron Komut Dosyasında sistem tarihini / saatini kullanma


37

Sunucumda bulunan bir MySQL veritabanını yedekleyecek bir Cronjob kuruyorum, ancak aynı dosyanın üzerine tekrar tekrar yazmasını istemiyorum. Bunun yerine, aralarından seçim yapabileceğiniz, otomatik olarak yapılan bir yedekleme dizisine sahip olmak istiyorum. Örneğin:

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

Ve bunun gibi.

Cronjob'ımda sistem tarihini ve / veya saatini bir çeşit değişken olarak kullanmamın bir yolu var mı? Değilse, aynı şeyi yapmak için önerileriniz nelerdir?

Yanıtlar:


45

Böyle bir şeyi deneyebilirsin (glenn jackmann'ın not ettiği gibi, tüm %karakterlerden kaçmalısın ):

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

Özel cronunuzun komutunu crontab komutunun kendi içinde bir komut dosyası olarak çalıştırıp çalıştırmayacağını veya tarihi bir dize olarak belirleyen bir komut dosyası yazmanız gerekip gerekmediğini görmek için mysqldump komutunuzu çalıştırıp çalıştırmadığınızı görmek için.

Kaçan olmadan %Redhat Enterprise Linux 5.0 üzerinde, "cron'u" (Sanırım) eşleşen bir görmediklerine hakkında bana hata veren tuttu ). Bunun nedeni, çıkmadan sonra gelen her şeyin %komutun standart girişine gönderilmesidir.

Ayrıca %F, dosya adlarını, sözlü olarak sıralandığında tarihe göre sıralamak için ISO8601 tarih biçimini (yyyy-mm-gg, yani ) kullanmanız da önerilir .


23
dateBir cronfile içinde dikkatli olmak gerekir: bazı crons (hepsi?) %Komutun sonu olarak kabul. (yani $()sorun değildi). Tüm yüzde işaretlerinden kaçmak zorundasınız: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(sözlükbilgisine göre
sıralanan

2
glenn jackman doğrudur: yukarıdaki crontab girişindeki '%' karakterlerinden kaçmak çalışır. Bunun gibi bir RHEL 5.0 crontab girdisi görünüyor: "\% d) .sql - - \% m /tmp/backup.$(date + \% Y" 50 11 * * * Dokunmatik
Bruce Ediger

Bir alt kabuk kullanmanın, bir ortam değişkeninde çalışmadığını not etmek önemlidir. Böylece, DATE=$( date -I )ve daha ${DATE}sonra $( date -I )işin komut satırında hazır bilgi kullanarak sonuçları kullanın.
Christopher Schultz

1
%OpenSuse 42'de de kaçmanın gerekli olduğu görülüyor.
kgadek

7

Kullanabilmelisin date.
Detaylar için info dateveya man dateyazın.

Aşağıdakine benzer bir şey size uygun olabilir (tarih biçimini ihtiyaçlarınıza göre değiştirin)

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

Yine, %cron içindeki tüm karakterlerden kaçmak için dikkatli olun .
glenn jackman

@glenn: Üzgünüz, elbette. Sözlükbilim sırasına göre, OP'nin tarih formatına yeni ulaştım. Şahsen ISO formatını beğendim, senin gibi.
asoundmove


1

İşte kullandığım bash betiği:

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

Dosyalar şuna benzer:

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

Gece veya her neyi tercih ederseniz çalıştırmak için cron işini bu noktaya getirin.


Bu bir cazibe gibi çalışır. Yine de, burada neler olduğunu tam olarak anlamadım. Geri tepmeler diğer programların çıktısının dahil edilmesine izin veriyor mu? Peki ya biçimlendirme (+% F gibi)?
AeroCross

1
Evet, geri tepmeler, çıkışın komutun kendisiyle ikame edildiği yerde komut değiştirme gerçekleştirir. Bakınız Bölüm 3.4.5 Burada daha kapsamlı veri için değiştiricilerinin listesi linke

Vay, bu harika bir kaynak. Öğrenmeye devam etmek her zaman harikadır. Bağlantı için çok teşekkür ederim!
AeroCross

0

dateKomutu kullanan ve yedekleme komutunuzu çağıran küçük bir sarmalayıcı komut dosyası yazın.

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.