BattOS

Dosyaları Yedekleme

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.

Script

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 folder1in sıkıştırılmış arşivini backupdirde 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.

Cronjob

Ö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