Rsync yedekleme için oluşturduğum bash betikte bazı sorunlar

Başlatan serdardb, 28 Ekim 2015 - 11:35:28

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

serdardb

Merhaba arkadaşlar.
backup.sh betiği aşağıdadır.

#!/bin/bash
#Dizin belirtiyoruz
DIZIN="/degisikliklerin/kaydedilecegi/dizin/yolu"
#Değişikliker timestamp damgası ile klasör oluşturulup içine atılacak
INCREMENTDIR=`date +%s`
#Değişikliklerin yükleneceği klasör
YOLU="/degisiklikler/"
#DIZIN, YOLU ve INCREMENTDIR yollarını birleştiriyoruz. Backup alınacak tam yolu belirliyoruz.
BIRLESTIR="$DIZIN$YOLU$INCREMENTDIR"
#Yedekleme gün sonu hangi dizine yapılacak
BACKUPDIR="/gun/sonu/tam/backup/alinacak/dizin"
#Gün sonu yedekleme ismi
TARIH=`date +%Y-%m-%d`


#Uzak sunucu yolu
UZAKSUNUCU="root@ipadresi:/yedek/alinacak/tam/dizin/yolu"

#Yedek sunucu yolu
YEDEKSUNUCU="/yedek/sunucu/yedek/tam/dizin/yolu"

#Ne zaman yedekler silinecek
expired=30


#rsync kodumuz
sshpass -p "rootsifresiburaya" rsync --backup --backup-dir=$BIRLESTIR -av $UZAKSUNUCU $YEDEKSUNUCU

#Değişikliklerin olduğu dizine gidiyoruz.
cd $DIZIN$YOLU
#klasörler listelenip silmeye çalışılıyor. Eğer içi boşsa silinecektir.
ls -d */ | while read d
do
        rmdir $d
done


#Bu Alan Günde 1 Kere Çalışmalı. Bu işlem bitmeden cron başka işlem yapmamalı.
cd $BACKUPDIR
#DIZIN yolu tar.gz olarak sıkıştırılıyor.
tar -czf $TARIH.tar.gz $DIZIN
#Değişiklikler klasörü siliniyor.
rm -r $DIZIN$YOLU
#BACKUPDIR içinde belirtilen günden uzun olanlar siliniyor.
find $BACKUPDIR -type d -mtime +$expired | xargs rm -Rf


Yukarıdaki betikte rsync yardımıyla değişen dosyaları değiştirmeden önce timestamp ile oluşturulan klasöre var olan dosyaları yedekleyip yenisi ile değiştiriyor.
Değişen birşey yoksa yinede degisikler klasörüne timestamp ile yeni bir klasör oluşturuyor rmdir ile boş ise oluşturduğu klasörü sildiriyorum.

Şimdi yapmak istediğim betikte yer alan
#Bu Alan Günde 1 Kere Çalışmalı. Bu işlem bitmeden cron başka işlem yapmamalı.
yazının altında kalan işlemi günde 1 kere yapacak şekilde ayarlamak ve bu işlem bitmeden diğer cron işlemi çağrılsa bile işlem yapmamasını sağlamak.
böylece gün sonunda tam yedek oluştururken yeni bir cron işlemine maruz kalmamasını sağlamalıyım.

Ayrıca değişiklik yoksa yinede klasör oluşturmasını engelleyebilir miyim?
Gerçi her cron işlemi sonrası boş ise sileceği için pek sorun olacağını sanmıyorum ama eğer uzak sunucuya yeni bir dosya eklendiyse eklendiği yolu degisiklikler klasörüne oluşturuyor ama daha önceden bu dosya yedek sunucuda olmadığı için klasör içi boş oluyor. fakat timestamp ile oluşturulan klasörün içinde başka klasörler eklediği için bu klasör yolu silinemiyor.




Yukarıdaki mesaj başka bir forumda yazdığım fakat cevap alamadığım bir mesajdır.
Yukarıdaki kodların anlamını sizin daha iyi bildiğinizi biliyorum. Tekrar yazmak ile uğraşmadan direk kopyaladım.
Yazdığım daha doğrusu sağdan soldan okuduğum bilgiler ile derlediğim ilk bash betiğidir. Bazı alanlarda saçmalamış olabilirim :)

Not: rsync sorgusunda şifreyi sormadan işlem yapması için sshpass kuruldu ve bu özellik sayesinde tek satırda şifreyide girerek hızlıca işlem yaptırdım. Güvenlik için pek sağlıklı bir yöntem değil gibi geldi bana ama daha güvenli nasıl yapabilirim bilemedim.

burk

@serdardb öncelikle gönüllülük esasına dayanan bu forumda hemen cevap alamadığın için lütfen hemen tepki gösterme, hatta bence tepki de gösterme. :)

Ayrıca herkes her şeyi bilmiyor, kimsenin bir konuda senden daha iyi olduğunu varsayma. :)

Konuyla ilgili olarak bu çalışma için hangi kaynağı kullandın? Onu bizimle paylaşırsan belki yardımcı olabiliriz.

heartsmagic

İlk sorunu eğer yanlış anlamadıysam basit bir "kilit" dosyası oluşturarak halledebilirsin. İşlemin bitmesini istediğin adım kendisini başlat, sonra istediğin isimde bir dosya oluştur, işlem bitince de bu dosyayı sildir. Adı geçen işlemi de bir koşul satırı ile denetleyeceksin, elbette koşul da dosyanın olmaması olacak. Böylece:

1. Bak bakalım dosya var mı? Yok, o zaman devam et. Eğer varsa iptal.
2. İşleme başla.
3. Dosyayı oluştur.
4. İşlemi bitir.
5. Dosyayı sil.

Dediğim gibi dosya ismi herhangi bir şey olabilir. Genellikle gizli dosya yapıyor bunu geliştiriciler, görüntü kirliliği yapmasın diye.

Eğer yamulmuyorsam bu iş görecektir. İkinci sorunu anlayamadım, gerçi betiği de ince ince okuyamıyorum şu an. İki saatlik uyku ile bu saatte ancak bu kadar :)
sshpass meselesini sormuşsun, farklı yöntemler kullanılabiliyor esasında. Fakat genel geçer olanların hepsinde bir tehlike mevcut. Kullanılan sistemin kendisini sağlam tuttuktan sonra sshpass ile betik içinden bağlanman çok sorun olmayacaktır sanırım. Doğrudan uçbirimden bağlanırsan geçmiş kayıtlarında kabak gibi görünür parola, fakat o kullanıcının geçmişine erişebilecek birileri olmalı. Şimdi sana parola kullanma, anahtar oluştur parolasız ve karşı sunucuya yükle diyeceğim ama onun da kendince açıkları var işte.

Not: Bir daha okudum da soruyu "cron başka işlem yapmamalı" dediğin aynı betik mi yoksa herhangi bir işlem mi?
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

serdardb

Alıntı yapılan: burk - 28 Ekim 2015 - 22:26:15
@serdardb öncelikle gönüllülük esasına dayanan bu forumda hemen cevap alamadığın için lütfen hemen tepki gösterme, hatta bence tepki de gösterme. :)

Ayrıca herkes her şeyi bilmiyor, kimsenin bir konuda senden daha iyi olduğunu varsayma. :)

Konuyla ilgili olarak bu çalışma için hangi kaynağı kullandın? Onu bizimle paylaşırsan belki yardımcı olabiliriz.

Merhaba hocam cevabınız için teşekkür ederim.
Buradaki konuyu başka bir forumda açmıştım oradan buraya taşıdım. Herhangi bir sitem etmedim cevap almadım diye yanlış anlaşıldı sanırım.
Elbette herkes herşeyi bilmiyor bu kesinde ilk defa bash kod yazdığım için çok taze olduğumdan  öyle birşey yazdım.
Sorunuza gelecek olursak belli bir kaynak yok. Rsync kodları Türkçe ve yabancı birçok kaynaktan bakarak derlemeye çalıştım.
Bash kod nasıl yazılır diye de birçok Türkçe ve yabancı kaynak inceleyerek elimden geldikçe birşeyler yazmaya çalıştım.

Alıntı yapılan: heartsmagic - 28 Ekim 2015 - 23:41:59
İlk sorunu eğer yanlış anlamadıysam basit bir "kilit" dosyası oluşturarak halledebilirsin. İşlemin bitmesini istediğin adım kendisini başlat, sonra istediğin isimde bir dosya oluştur, işlem bitince de bu dosyayı sildir. Adı geçen işlemi de bir koşul satırı ile denetleyeceksin, elbette koşul da dosyanın olmaması olacak. Böylece:

1. Bak bakalım dosya var mı? Yok, o zaman devam et. Eğer varsa iptal.
2. İşleme başla.
3. Dosyayı oluştur.
4. İşlemi bitir.
5. Dosyayı sil.

Dediğim gibi dosya ismi herhangi bir şey olabilir. Genellikle gizli dosya yapıyor bunu geliştiriciler, görüntü kirliliği yapmasın diye.

Eğer yamulmuyorsam bu iş görecektir. İkinci sorunu anlayamadım, gerçi betiği de ince ince okuyamıyorum şu an. İki saatlik uyku ile bu saatte ancak bu kadar :)
sshpass meselesini sormuşsun, farklı yöntemler kullanılabiliyor esasında. Fakat genel geçer olanların hepsinde bir tehlike mevcut. Kullanılan sistemin kendisini sağlam tuttuktan sonra sshpass ile betik içinden bağlanman çok sorun olmayacaktır sanırım. Doğrudan uçbirimden bağlanırsan geçmiş kayıtlarında kabak gibi görünür parola, fakat o kullanıcının geçmişine erişebilecek birileri olmalı. Şimdi sana parola kullanma, anahtar oluştur parolasız ve karşı sunucuya yükle diyeceğim ama onun da kendince açıkları var işte.

Not: Bir daha okudum da soruyu "cron başka işlem yapmamalı" dediğin aynı betik mi yoksa herhangi bir işlem mi?
Merhaba hocam, öncelikle cevabınız için teşekkrüler.

Şu şekilde aktarayım.
backup.sh isminde bir betik oluşturdum yukarıdaki gibi.
Bu betiği her dakika cron ile çalıştıracağım.
Böylece sunucumda yapılan tüm değişiklikler dakikalık olarak yedek sunucuma aktarılacak.
Rsync ile yedekleme yaparken yedek sunucu üzerinde bir dosyayı değiştirmeden önce yedek sunucuda bu değişecek dosyanın yedeğini alıyorum.

Örneğin;

Normal Sunucu
--abc
----xyz
------klm
--------asd.php
--------dsa.php

Yukarıdaki gibi abc klasörü içindeki xyx klasörü içindeki klm klasörü içindeki asd.php ve dsa.php dosyalarında bir değişiklik var ise

Yedek Sunucu
--abc
----xyz
------klm
--------asd.php
--------dsa.php
--degisiklikler
----123456789 (o anın timestamp değerine göre yeni klasör oluşturuyor)
------abc
--------xyz
----------klm
------------asd.php
------------dsa.php

Yedek sunucuda önce degisikler klasörü içinde o anın timestamp değerinde bir klasör oluşturuyor ve değişiklik yapılan dosyaları klasörlerini olduğu gibi oluşturarak içine önce yedek sunucudaki halini atıyor sonra yedek sunucudaki yerini yeni hali ile değiştiriyor.
Buraya kadar herşey normal olarak ilerliyor.

Normal sunucu içerisine
--abc
----xyz
------klm
--------benyenibirdosyayim.txt

şeklinde yeni bir dosya eklediğim zaman yedek sunucuda aşağıdaki gibi bir yapı oluşuyor.

--abc
----xyz
------klm
--------benyenibirdosyayim.txt
--degisiklikler
----123456789
------abc
--------xyz
----------klm

yani yedek sunucuda o dosya olmadığı için degisikler klasörüne yolunu oluşturuyor ama içi boş klasörler

Normalde Rsync işleminde herhangi bir değişiklik yoksa da timestamp değerinde otomatik klasör oluşturuyor ama rmdir komudu ile içi boş ise silebiliyorum.
Fakat yeni dosya attığım zaman içi boşta olsa bu klasörler içine yeni klasörler oluşturulduğu için rmdir ile silme işlemi yapamıyor.
Yani yeni atılan dosyaların yollarında klasörler oluyor ama içleri boş ve silemiyorum (-R gibi kesin sil gibi işlemler var ama içleri dolu ise silmemem gerekiyor yani sadece boş klasör ise sil, dosya varsa elleme gibi birşey yapmam lazım)

birde mümkün ise herşeyi tek betik içinde yapmak istiyorum.
yani gün içinde her dakika cron ile bu betik çağrılacak ama gün sonunda 23:59:59 da çalıştığında gün sonu yedeği alacak (buda ortalama 10-15 dk kadar sürüyor, tabi değişken bir şekilde) ve bu yedek alma işlemi bitene kadar betik 00:00:00 da çağrılsa bile çalışmayacak. Gün sonu alma işlemi 12 dk sonra sona erdiyse 00:13:00 da çağrıldığı zaman tekrar eskisi gibi değişiklikleri kaydetmeye devam edecek.

heartsmagic

Sondan başlayayım, aynı soruyu sormuşsun benim kilit dosyası oluşturma fikrimi düşündün mü?

Betiğin kendisini yorumlamam mümkün değil zira sana sade gelen şey bize karışık geliyor buradan :) Fakat kabaca bu kadar uğraşacağına git üzerinden takip ettirsen dosyalarını nasıl olur diyesim geldi?
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.