Diyelim ki bir dosya/dizin var ve bu dosyanın belli bir sürede bir yedeğinin alınmasını istiyorum. Bunu elle yapabilirim ama bir script ile otomatik de yapabilirim.
Scriptimizin yapacağı şey şu: belirttiğimiz dosya/dizin in arşivlenmiş halini belirttiğimiz yerde oluşturacak ve bu arşivin ismi “backup_gün_ay_yıl.tar.gz” şeklinde olacak. Böylece yedeğin ne zaman alındığını anlayabileceğiz. Ayrıca yedeklerin birikmemesi için yedek sayısı 4ü geçince otomatik olarak en eski yedeği silecek.
Yazmaya başlayalım:
#!/bin/bash
folder1="$HOME/Project"
filename="backup_`date +%d`_`date +%m`_`date +%Y`.tar.gz"
backupdir="$HOME/backup"
Yukarıdaki kodu açıklayayım.
folder1
bir değişken ve bu değişken yedeğini alacağımız dizinin yolunu tutuyor. filename
ise yedek dosyanın ismi, içinde date komutu kullanarak tarihi alıyorum. backupdir
ise yedeklerin tutulduğu dizin olacak.
Devam edelim.
tar -czvf $backupdir/$filename $folder1
Bu satırda tar
ve gzip
ile folder1
in sıkıştırılmış arşivini backupdir
de filename
adıyla oluşturuyoruz.
retVal=$?
if [ $retVal -eq 0 ]
then
echo "+ Yedekleme tamamlandı."
else
echo "! Yedekleme sırasında bir hata oluştu."
fi
Burada ise önce tar
komutunun döndüğü exit code/return value alıyoruz. Bu kod genelde bir sayıdır ve tar
komutunun man
sayfasına bakarsak 0’ın “Successful termination” anlamına geldiğini görürüz. Bu kısımda yaptığımız şey arşivleme ve sıkıştırmanın hatasız bir şekilde yapılıp yapılmadığını kontrol etmek. Eğer dönen kod 0’a eşitse “+ Yedekleme tamamlandı.”, eğer başka bir şeyse “! Yedekleme sırasında bir hata oluştu.” yazıyoruz.
Şu anda programın iskeleti tamam. Yedeklemeyi yapıyor. Şimdi yapmamız gereken eski yedekleri silecek kısmı yazmak.
bCount=$(ls -1q $backupdir/*.gz | wc -l)
Bu satırda yaptığımız işlem bCount
değişkenini oluşturmak ve backupdir
dizini içerisinde kaç tane .gz
uzantısı ile biten dosya olduğunu atamak.
Daha da açarsak ls -1q $backupdir/*.gz | wc -l
komutunda -1q
her satıra bir dosya gelecek şekilde yazdırır. wc -l
de kaç satır olduğunu sayar.
if [ $bCount -gt 4 ]
then
echo "- Eski yedek siliniyor."
echo "`ls -rt $backupdir/*.gz | head -n 1` siliniyor."
rm -- $(ls -rt $backupdir/*.gz | head -n 1)
if [ $? -ne 0 ]
then
echo "! Silme işlemi sırasında bir hata oluştu."
retVal=1
fi
fi
Burada bCount
değişkeni 4 fazla mı diye kontrol ediyor. Daha sonra en eski .gz uzantılı dosyayı siliyor. Ve sonuç olarak rm
nin döndüğü değere bakıyor. Eğer hata varsa belirtiyor ve retVal
ı 1’e eşitliyor. Daha fazla açarsak ls -rt $backupdir/*.gz | head -n 1
komutunda ls -rt
modify date’e göre sıralar, en eskiden en yeniye. head -n 1
de ilk sıradakini alır.
exit $retVal
Bu satırda ise retVal
değerini dönerek programdan çıkıyoruz.
Artık yedeklemeyi otomatik yapan bir scriptimiz var. Şimdi bu scripti her hafta çalışacak şekilde ayarlamamız lazım.
Öncelikle backup.sh
ı çalıştırılabilir yapmamız lazım. Bunun için chmod +x backup.sh
diyoruz. Daha sonra crontab -e
diyoruz ve gelen yere 0 0 * * 0 $HOME/backup.sh
giriyoruz. Kaydedip çıkıyoruz. ($HOME/backup.sh sizde farklı olabilir, backup.sh’ın yolunu girmeniz gerekiyor.) Bu girdiğimiz değer her pazar günü saat 00.00’da backup.sh ı çalıştırır. (0 0 * * 0
değeri dakika/saat/gün(aylık)/ay/gün(haftalık) olarak. crontab.guru‘ya göz atın.)
Böylece istediğimizin dizin/dosyanın düzenli olarak yedeğini alacak şekilde ayarlamış olduk.
Kerem Ü.
kerem.ullen@proton.me