Uygulama 6 | Yedekleme Sistemi (Backup System)

Bu projede kullanıcıdan birkaç dosya alacağız ve aldığımız bu dosyaları belli zaman aralıklarında bir 'tar.gz' dosyası içerisine yedekleyeceğiz. Tahmin edebileceğiniz üzere bunun için 'Crontab' kullanacağız. Crontab konusunu anlatırken direkt olarak 'crontab -e' şeklinde bir komut verip bir 'cron job' oluşturabiliyorduk. Ancak burada bu işlemi otomatik olarak yapacağımız için belli bir lokasyona girmemiz gerekiyor ve bu lokasyona yalnızca root kullanıcı girebiliyor; aslında bu iyi bir şey. Dolayısıyla bu script'i kullanabilmeniz adına öncelikle 'root' olmanız gerekiyor.

Script içerisinde 'Shebang (#! /bin/bash)' ifademizi yerleştirdikten sonra 'root' kontrolü yapmamız gerekiyor.

Bu kodu, daha önceki uygulamaları takip ettiyseniz rahatça anlayacaksınızdır. Yukarıdaki kod kısaca; "Kullanıcı eğer 'root' değilse 'root olmalısın' şeklinde uyar." anlamına gelmektedir.

Kullanıcı 'root' değilse onu uyaracağız. Ancak eğer 'root' ise işlemlerimize devam etmemiz lazım. Dikkat edin bu kod, herhangi bir fonksiyon veya arka planda çalışacak bir kod değil. Bu, direkt olarak kodların merkezi konumundadır. Zaten yorum satırlarına da bakarsanız bunu rahatlıkla anlayacaksınızdır.

Kullanıcı eğer 'root' ise ona bir uyarı verebiliriz. Uyarımız, "yedeklemek istediğin dosyaları aynı lokasyonda topla" şeklinde olabilir. Bu, her ne kadar kullanıcıyı zahmete sokan bir hareket gibi gözüküyor olsa da hem programın verimliliği açısından hem de kullanıcının hata yapmasını önlemek açısından uygun bir harekettir. Kişi, o gün içerisinde pek verimli olmayabilir. Dolayısıyla içerikleri ve lokasyonları farklı ancak aynı isimde olan iki farklı dosyayı birbirine karıştırabilir. O yüzden bunu yapıyoruz.

Bu uyarı olayı için size, 'echo -e "Dosyaları aynı lokasyona taşıyın.\n"' şeklinde bir kod vermek istemiyorum. Biraz yeni bir şeyler öğrenelim.

'notify-send'. Bu metot, ekranın sağ üst köşesinde kullanıcıya normal bir sistem bildirimi gibi görünen bildirim gitmesini sağlayacaktır. Bu noktada 'notify-send' kısmı bizden, bildirimin başlığını ister. Bir alt satırda ise bildirimin içeriğini (content) isteyecektir. Son olarak '-t' yani 'time' parametresi ile bu bildirimin ekranda ne kadar süre boyunca kalacağını belirlememiz beklenir.

Burada dikkat etmeniz gereken iki nokta var. Birincisi, son satır haricindeki satırların sonuna ters slash (AltGr + *) koyuyoruz. İkincisi ise bu metot, sadece bunlarla sınırlı değildir. Örneğin bildirimin köşesinde bir görselin gözükmesini isterseniz '-i' yani 'image' ifadesini vermeniz ve görselin lokasyonunu belirtmeniz gerekir: '-i /root/Desktop/BackupSystem/CyberWormWallpaper.jpg \'. Daha detaylı bilgi isterseniz 'man notify-send' ifadesini girebilirsiniz. Ayrıca bunu yapmak için daha başka komutlar, metotlar da mevcuttur; araştırmanızı yapabilirsiniz.

Şimdi, kullanıcının root olup olmadığını kontrol ettik ve iki ihtimali de değerlendirdik. Bu işlemden sonra aslında yedekleme işlemi için kullanıcıdan bir tar.gz dosyası (.zip gibidir, sıkıştırılmış dosyaları içerir, UNIX sistemlerde vardır) ismi isteyebiliriz. Bununla beraber bahsettiğimiz 'dosyaları aynı lokasyona koyma' işi için de bir lokasyon isteyelim.

getFileAndDir isimli bir fonksiyon açtım ve bahsettiğim iki bilgiyi kullanıcıdan istedim. Bu noktada global alana 'extension' isminde bir değişken tanımladım ve değerini 'tar.gz' olarak belirledim. Kullanıcıdan, tar.gz dosyasının ismini istediğimiz zaman bu eklentiyi o ismin sonuna koyacağız ve örneğin 'deneme.tar.gz' şeklinde olacak.

Bu noktadan sonra kullanıcıdan yedeklenecek olan dosyanın/dosyaların ismini istememiz gerekiyor. Hemen bakalım.

"'while true' da ne demek oluyor?" tarzında sorularınız olabilir; gayet normaldir. while döngüsünü zaten biliyorsunuz ancak buradaki 'true' ifadesi ile ilk defa karşılaşıyorsunuz. Burada aslında "while koşulu sağlandığı sürece" şeklinde bir ifade vermiş oluyoruz. Buradaki 'true' ifadesi 'false' ifadeye dönüşür dönüşmez döngü sonlanacaktır. while içerisine dosya istediğimizi belirttik. Peki, dosya ismi isteme işlemini döngü ile yaparken diğerlerini neden döngüye koymadık?

Bunun sebebi; aslında kullanıcıdan bir defalığına lokasyon bilgisi ve bir 'tar.gz' dosyası ismi isteyeceğimizdir. Kullanıcı, bu bilgileri bize verdikten sonra istediği kadar dosya seçebilir durumda olmak zorundadır. Ancak bize, sadece bir adet lokasyon bilgisi ve bir adet tar.gz dosyası ismi gerekiyor.

Bunu yaptıktan sonra döngüyü iki şekilde sonlandırabiliriz. Ya direkt olarak break kullanabiliriz ya da kullanıcıdan 'kapat' anlamında bir girdi isteyebiliriz. Biz, birden fazla dosya girdisi isteyeceğimiz için ikinci seçenek daha uygun olur çünkü kullanıcı istediği kadar dosya ismi girdikten sonra bir komut ile bu döngüyü bitirebilir durumda olmalıdır.

Bunun için şu şekilde bir komut vereceğim: "Eğer kullanıcı, dosya ismi girmek yerine 'q' harfini girerse dosya ismi istemeyi bırak".

Yukarıdaki koda aşinasınızdır. Şimdi, aslına bakarsanız girilen dosyanın var olup olmadığını kontrol etmek mantıklı olacaktır ancak bunu, bildiğimiz yöntemle yapmayacağım. Bunu yaparken 'find' komutunu vereceğim.

'Find', 'Bulmak' anlamına gelir ve bunu, bir lokasyonda veya bütün bir Linux sisteminde bulmak istediğimiz bir dosyayı bulmak için kullanırız. Nasıl yapıldığına bakalım.

İlk komutum 'pwd' oldu ve gördüğünüz gibi şu an /root içerisindeyim. Ancak ben, Desktop içerisinde test.sh isimli bir dosya olup olmadığını görmek istiyorum; ne yaparım? Elbette; ilk önce find anahtar kelimemi verir, aradığım lokasyonu girer, -name argümanı ile dosyanın ismini yazar ve ararım. Eğer bir sonuç bulunursa ekrandaki gibi dosyanın lokasyonunu görebileceğiz. Ancak bir sonuca erişemezsek, herhangi bir çıktımız da olmayacaktır. Peki, bir sisteme girdiğinizi ve belli bir dosyayı çalmanız gerektiğini varsayalım (yapmayın öyle şeyler). Dosyanın da ismi, 'cards.txt' olsun. Bu dosyayı, sistemdeki her lokasyonu teker teker girerek (/root/Desktop, /root/Documents vb.) mi yaparsınız? Profesyonel biri böyle yapmaz; "tek seferde her yeri kontrol edebilir miyim?" diye düşünür. Bakalım.

Yukarıda gördüğünüz ve daha önceden hatırladığınız üzere herhangi bir lokasyonda iken sadece 'cd' komutu ile ilk dizine inebiliyorduk. Peki, tam bu noktada bir defa da 'cd ..' komutunu verirsek ne olur?

Yeşil kutuya bakalım. cd .. komutunu verip pwd çalıştırdığımda '/' şeklinde bir ifade görüyoruz. Bu ifade, 'dosya sisteminin kendisini' ifade eder yani her şey bunun içerisindedir. Zaten 'ls' çalıştırdığımızda 'root' ve 'home' gibi en önemli klasörlerin de (örn. /etc) burada bulunduğunu görebilirsiniz. O zaman biz, find komutunu kullanırken lokasyona sadece '/' ifadesini verirsek ne olur? Evet, dosyayı bütün sistemde arar.

Documents içerisindeyken sadece '/' ifadesini verdim ve bu komut, o dosyayı bulana kadar bütün sistemde aradı. Bulduğunda da lokasyonunu verdi. Şimdi, bunu kodumuzda kullanalım.

findTheFile=`find / -name $fileName` komutunu vererek kullanıcının verdiği dosya isimlerini dinamik olarak her yerde arayacağım ve eğer varsa bunu ifade edeceğim. Peki, bunu direkt olarak kullanmak yerine neden bir değişkene atadım? Elbette, ilerleyen kısımlarda her seferinde bu komutu yazmak yerine sadece değişkeni yazmak için. Ayrıca lütfen dikkat; tırnak işaretinin şekline dikkat edelim, daha önce açıklamıştım.

Dosya bulunursa 'bulundu', bulunamadıysa da 'bulunamadı' yazdırıyoruz. Peki, kullanıcıdan 3 tane dosya ismi aldığımızı varsayalım. Böyle bir durumda 'fileName' değişkeni sürekli olarak yani kullanıcı, her yeni dosya ismi girdiğinde değişmez mi? Elbette, değişir. Ancak bu sorunu nasıl çözebiliriz? Yani girilen dosya isimlerini bir yerde toplasak ve en sonda bu küme içerisinden işlem yapsak nasıl olur?

'Dizi (array)' dediyseniz tebrikler.

Bunun için yine gobal alana 'files=()' şeklinde boş bir dizi tanımlıyorum. Kullanıcının girdiği her dosya ismini buraya ekleyeceğiz. Bu noktada 'index=0' şeklinde bir tanımlama daha yapıyorum. Peki, dizilerin zaten kendi index'i yok mu, neden ayrıca tanımlıyoruz?

Birazdan, dosyalar her eklendiğinde index'in birer birer artması gerektiğini göreceksiniz. Yoksa sürekli olarak girilen her dosya ismi, files[0] olarak kayda alınacaktır ve her yeni girişte bu dizinin sıfırıncı index'i içerisindeki eleman silinecek, yerine yeni girilen dosyanın ismi gelecektir. Yani biraz önceki değişken mantığının aynısı olacaktır. Bu yüzden birazdan, 'files[index]=$fileName' diyeceğiz ve index değerini birer birer artıracağız. Bu sayede ilk dosya sıfırıncı index'e kaydolacak, ikincisi ise birinci index'e kaydolacak ve bu böyle sürecektir. O zaman yapalım.

index=0 dedik ve normal index mantığı gibi değişkeni sıfırdan başlattık. Burada files[index]=$fileName derken aslında files[0]=$fileName demiş ve bunu kaydetmiş oluyoruz. Daha sonra index değerini bir artırıyoruz. Bu sayede döngü başa döndüğünde ve yeni bir dosya ismi girişi olduğunda kodumuz; files[1]=$fileName olacaktır.

Şimdi, kullanıcının 'q' tuşuna basmadığı koşulda yapılacakları yazdık.

Peki, 'q' tuşuna basılırsa ne olsun? Tabii ki döngü sonlansın ve çıkışımız gerçekleşsin.

Son olarak aklımda bir şey var. Hani kullanıcı, girdiği her dosya isminden sonra dosya ismi 'files' dizisine ekleniyordu ya? İşte, girdiği her mevcut dosya için o diziyi kullanıcıya gösterelim ve ne aşamada olduğunu bilmesini sağlayalım. Hatta bu bilgiyi, 'q' tuşuna basıp döngüden çıktığında da gösterelim ki son halini görsün.

Bunun nasıl olduğunu daha önce gösterdiğim için şu an anlatmıyorum ancak girinti sistemine çok dikkat etmenizi ve bunların, işlemler bittikten sonra yapıldığını bilmenizi istiyorum.

Buraya kadar; kullanıcıdan, yedeklemek istediği dosyaların isimlerini ve lokasyonunu aldık. Bununla beraber bu dosyaların barındırılacağı 'tar.gz' dosyasının ismini aldık ve gerekli işlemleri yaptık, uyarıları verdik. Şimdi sıra Crontab kısmında. Eğer ne olduğunu unuttuysanız lütfen dönüp bakın.

Burada, crontab için gerekli olan 'm, h, dom, mon, dow' kısımlarını almamız gerekiyor. Bunun için basit bir fonksiyon daha açıyorum.

Yukarıda gördükleriniz, oldukça bilindik şeyler. Sadece en başta kullanıcıyı güzel bir dille uyarıyoruz.

Şimdi, kullanıcının neden root olması gerektiğine bakalım.

Linux içerisinde / (dosya sistemi) içerisinde /var isimli bir klasör vardır. Bu klasörü takip edecek şekilde de 'spool', 'cron', 'crontabs' klasörleri vardır. İsterseniz 'cd' ile oraya gidip içerisine bakalım.

İsimlerden de anlayacağınız üzere burada çeşitli kullanıcıların crontab'leri olur. Şu an için bende sadece 'root' kullanıcısına ait crontab mevcut. Burada isterseniz farklı kullanıcılara da crontab yaratabilir ve her kullanıcının belli bir zamanda belli bir işi yapmasını sağlayabilirsiniz. Bunun risklerini hayal edebileceğinizi düşünüyor, neden root olmamız gerektiğini anladığınızı varsayıyorum.

NOT: Yeni kullanıcı eklemek isterseniz; 'crontab -u cyberworm -e' komutunu vermeniz gerekir. Buradaki '-u', 'user' anlamına gelirken 'cyberworm', kullanıcı adını ifade eder. 

Normal şartlarda 'crontab -e' dediğimizde açılan dosya, aslında burada yer alan dosyadır. Biz de bu klasöre girip root dosyasına yani root kullanıcısının crontab'ine echo komutu ile çeşitli eklemeler yapacağız. Bu yüzden bu işi yapması için yeni bir fonksiyon açıyorum.

addCronJob isimli bir fonksiyon açıyorum ve gerekli klasöre 'cd' ile gidiyorum. Daha sonra "içeriği silmeden" echo komutu ile biraz önce kullanıcıdan aldığımız zaman dilimlerini root kullanıcısının crontab'ine aktarıyoruz. Ancak burada bir eksik var, fark edebildiniz mi?

Crontab'e bir Cron Job eklerken en son kısımda 'command' olması gerekiyordu. Yani "Şu zaman geldiğinde şu işi yap" diyorduk. Bu noktada, yazmamız gereken şey bir yedekleme sistemi değil mi? Yani amacımız o. O zaman biz, şu an üzerinde çalıştığımız backup.sh isimli dosyayı command olarak verebiliriz, doğru mu? Yani "Şu zaman geldiğinde backup.sh dosyasını çalıştır ve yedekleme gerçekleşsin." şeklinde bir kullanım yapabiliriz, öyle değil mi?

Değil. Çok dikkat edelim; crontab, otomatik iş yapan bir arkadaşımız. Eğer biz, command kısmına şu an üzerinde çalıştığımız dosyayı verirsek crontab bu dosyayı çalıştıracaktır. Ancak vermemiz gereken girdiler ne olacak? Yani crontab çalışırken, terminal açılıp bize soru sormuyor, direkt olarak script'i çalıştırıyor. Ee, bu script, kullanıcıdan aldığımız bilgiler olmadan 'otomatik olarak' çalışamaz ki?

Demek ki bizim, yeni ama tam otomatik bir dosyayı crontab'e vermememiz gerekiyor. Yani dosya çalışırken ne bir girdi beklensin ne de bir işlemin yapılması zorunlu olsun. Hemen 'toBeWork.sh' isimli başka bir dosya oluşturuyorum. Bu iki dosya bağlantılı olacak.

Aşağıda tek bir görsel ama birçok açıklama olacak. Geri dönüp bakabilirsiniz.

Yeni açtığım dosyaya 'backup' isminde bir fonksiyon açtım. Buradaki ilk işim 'cd $fileLocation' komutu ile 'backup.sh' dosyası içerisinde kullanıcıdan aldığım lokasyona gitmek oldu.

Sonrasında 'arrMembers' yani 'dizi elemanları' isminde bir değişken ataması gerçekleştirdim ve bu değişkene `echo ${#files[@]}` değerini verdim. backup.sh dosyasında files=() şeklinde boş bir dizimiz vardı; hatırlayın. Ayrıca ${#files[@]} ifadesi, dizileri anlatırken de belirttiğim gibi dizi içerisindeki elemanların hepsini almamıza/görmemize olanak tanıyor.

Hemen altında klasik bir for döngüsü görüyorsunuz. Ancak buradaki döngü, ${files[@]} yani 'dizinin bütün üyeleri için' gerçekleşecektir. for döngüsü içerisinde 'tar -czf $tarFile ${files[@]}' şeklinde bir ifade görüyorsunuz. Bu ifade, komut aracılığıyla bir tar.gz dosyası oluşturmamıza ve içerisine dosya atmamıza olanak tanıyor. Bunun detayına inmek zorundayım.

'tar' anahtar kelimedir; bunu vermek zorundasınızdır. Buradaki 'c', 'create' kelimesinden gelir ve anlamı 'oluşturmak' şeklindedir. Yani bu argüman ile aslında bir tar dosyası oluşturuyoruz. 'z' ifadesi, 'gzip' ifadesinden gelir. 'gzip', GNU zip anlamını taşır ve asıl işi; sıkıştırılmış dosya olduğunu belirtmektir. Son olarak 'f' ise, arşivin yani tar.gz dosyasının ismini belirtir; fileName gibi düşünebilirsiniz. Elbette daha başka argümanlar ve yöntemler de vardır; araştırmak size kalmış.

Bu argümanları verdikten sonra backup.sh dosyasında kullanıcıdan aldığımız '$tarFile' değişkenini giriyoruz ve tekrar dizimizi yerleştiriyoruz. Burada, anahtar kelimeyi ve argümanları verdikten sonra ilk olarak tar dosyasının ismini belirtiyoruz ($tarFile). Bunu yaptıktan sonra; bu tar dosyasının içine alınacak dosyaların isimlerini yazmamız gerekiyor (file1, file2, file3... gibi.). Bu işlemi biz, dizi olarak verdik çünkü dosyalar zaten dizi içerisinde bekliyor.

Peki, yeni bir dosya oluşturduk ve içine bir fonksiyon tanımladık. Ancak şu an biz, çalışması için hem bu fonksiyonu çağırmıyoruz hem de backup.sh dosyasındaki değişkenler ve değerlerle nasıl haberleşeceğini bilmiyoruz. Nasıl olacak?

backup.sh dosyasına geri dönelim.

Az önceki fonksiyona yeni şeyler ekledim. Burada, yine 'find' komutunu kullandım ve bunu bir değişkene verdim. Çünkü bu komut ile bulunan dosyalar, dosyanın konumunu da veriyordu ve bu, crontab'e emir verirken bizim işimize yarayacak.

Az önce echo >> root "$m $h $dom $mon $dow" olarak yazdığımız koda ise $findSubScript değişkenini verdik. Yani crontab içerisinde şuna benzer bir şey göreceğiz: * * * * * /root/Desktop/toBeWork.sh

Bunu sağlarsak tam otomatik bir yapı elde etmiş oluruz ve toBeWork.sh dosyası nerede olursa olsun Crontab'e oranın konumunu vermiş oluruz.

Bazı sistemlerde crontab'e otomatik emir girince crontab afallıyor. Dolayısıyla sistemin yeniden çalıştırılması gerekiyor. Bunun için en alt kısma 'service cron restart' komutunu verdim.

Şimdi, haklı olduğunuz gibi toBeWork.sh dosyası otomatik olarak çalışmayacak çünkü onu çalıştıracak bir kod yok. Hemen backup.sh dosyasına yeni bir fonksiyon açıyorum.

İlk olarak her ihtimale karşı toBeWork.sh dosyasının izinleriyle oynuyorum. Bir sonraki satır, tam otomatik olayı için önemli. Bu kısımda endişe etmeyin, kodu çalıştırdığımızda her şeyi net olarak göreceksiniz. Bununla beraber dolar işaretli olanları ve string ifadeleri birbirinden iyice ayırt edin.

toBeWork.sh dosyasına ilk olarak tarFile='${tarFile}.${extension}' şeklinde bir ifade yolluyorum ve \n ile alt satıra geçiyorum. Buradaki 'tarFile' ifadesi, normal bir değişken iken ${tarFile}.${extension} ifadesi, biraz önce kullanıcıdan aldığımız tar.gz dosyasının ismini ve extension olarak aldığımız 'tar.gz' uzantısını içeriyor. tar.gz dosyasının isminin 'deneme' olduğunu varsayarsak sonuç; toBeWork.sh dosyasında tam olarak 'tarFile=deneme.tar.gz' ifadesi yer alacak.

İkinci kısımda files=(${files[@]}) ifadesi yer alıyor. Buradaki mantık da yukarıdakinin aynısıdır. Yedeklenecek dosyaların 'test.sh', 'deneme.txt', 'requirements.txt' olduğunu varsayarsak toBeWork.sh dosyasına aktarılacak olan yazı şu olacaktır: files=(test.sh deneme.txt requirements.txt)

Üçüncü kısımda fileLocation=$fileLocation ifadesi yer alıyor. Mantık tamamen aynı. Girilen lokasyonun /root/Desktop olduğunu varsayarsak toBeWork.sh dosyasında şu ifade yer alacaktır: fileLocation=/root/Desktop

Son kısımda ise, toBeWork.sh dosyasındaki fonksiyonun ismi yer alıyor. Bu, en altta yer almak zorunda çünkü onun öncesinde değişkenler tanımlanmış olmalıdır.

Yapmamız gereken tek bir şey kaldı. O da backup.sh dosyasındaki fonksiyonları çağırmak ve çalışmalarını sağlamak. Bunun için ilk önce root kontrolü yaptığımız kısma gidelim.

Kullanıcı root ise ona uyarı veriyorduk ancak sonrasını getirmemiştik. Dolayısıyla kişi eğer root ise ondan direkt olarak dosya ismi istemeye başlamamız yeterli olacaktır. Bu yüzden ilk fonksiyonumuz olan getFileAndDir isimli fonksiyonumuzu buraya çağırıyorum.

Kullanıcı, 'q' tuşuna bastığında dosya ismi istemeyi bırakıyor ve döngüyü kırıyorduk. Döngüyü kırmadan hemen önce toBeWork_shFile isimli fonksiyonu çağırırsak yeterli olacaktır. Çünkü toBeWork_shFile fonksiyonu, toBeWork.sh dosyasına komutlar transfer eden bir fonksiyondu ve komutlar arasında tarFile, files ve fileLocation vardı. getFileAndDir fonksiyonu sayesinde bu komutların değerlerini zaten aldığımız için bunu bu noktada çağırmakta sakınca yok.

Hemen arkasından crontabSetTime fonksiyonunu çağırıyoruz. Bu, $m, $h... gibi değerleri aldığımız fonksiyondu. Değişkenler ve onların değerleri toBeWork.sh dosyasına girer girmez bu fonksiyon çalışacak ve değerleri isteyecektir.

Değerler alındıktan sonra bu değerleri root kullanıcısının crontab'ine aktarmamız gerekiyordu. Dolayısıyla bu değerler alındıktan hemen sonra addCronJob isimli fonksiyonu çağırabiliriz.

Şimdi, kodumuzu çalıştıralım ve ne olacağına bakalım; ne olup bittiğini daha net anlayacaksınızdır.

Kodu çalıştırır çalıştırmaz sağ üst köşede bildirimimiz gözüktü. 

Sonrasında terminale baktığınızda göreceksiniz ki bize, tar.gz dosyasının ismini soruyor. Ben oraya 'deneme' ismini girdim. Sonrasında lokasyonu sordu; /root/Desktop dedim.

Şimdi, kırmızı kutulara teker teker bakmanızı istiyorum.

Bana, yedeklemek istediğim dosyayı sordu ve ona 'deneme.txt' girdisini verdim. Kendisi, find komutu sayesinde bu dosyayı aradı ve bulduğunda hem bulduğunu söyledi hem de tanımladığım diziyi (Your backup files: 'deneme.txt') güncelledi.

İkinci kutuda; 'boylebirdosyayok' isimli bir dosya ismi girdisi verdim ve gerçekten de bulamadı. Bulamadığı için de tanımladığım diziyi güncelleyemedi. Kalan son iki kırmızı kutucuk da aynı mantıkta çalışıyor.

Şimdi, 'q' tuşuna basacağım ve neler olacağını göstereceğim.

'q' tuşuna basar basmaz döngüyü kırdı ve bana, crontab için gereken zaman dilimlerini sormaya başladı. Hemen bunları tamamlayalım.

Gerekli bilgileri girdim ve son olarak bana, yedeklenecek dosyaların son halini gösterdi. Kodumuz başarılı bir şekilde çalıştı. Şimdi, toBeWork.sh dosyasına bakalım.

Gördüğünüz gibi ilk etapta sadece bir fonksiyon içeren toBeWork.sh dosyası içerisinde; fonksiyondaki değişkenlerin erişebileceği değerler eklendi. En sondaki satıra baktığınızda da fonksiyonun isminin yazdığını yani onun çağırıldığını görüyorsunuz. Bu eklemeleri backup.sh dosyası yaptı; ben değil.

Şimdi, root kullanıcısının crontab'ini görüntüleyelim.

En alt satırda emrimizi başarılı bir şekilde girilmiş şekilde görüyoruz.

Şimdi de oluşturulan tar.gz dosyamıza ve içerisine bakalım.

Gördüğünüz gibi 'deneme.tar.gz' olsun dedim; oldu. İçerisine deneme.txt, requirements.txt ve test.sh dosyalarını koy dedim; koydu. Şimdi, bu yedekleme olayını buradan gösteremem o yüzden sizin için bir Instagram Reel çektim. Reel içerisinde ilk etapta dosyanın ilk hali, daha sonra değiştirilmiş halinin yedeklenmesini göreceksiniz.

Bu işlemler bir dakika aralıklarla olacak çünkü crontab'e */1 ifadesini verdim ve bu "dakikada bir" anlamına geliyor; biliyorsunuz. Siz, istediğiniz bir zaman aralığı belirleyebilirsiniz. Instagram Reel linki ve kodların kesintisiz hali aşağıdadır. Sevgiler.

Instagram Reel Linki: https://www.instagram.com/reel/Cjl8u7koUMK/?igshid=YmMyMTA2M2Y=

Kodlar:

backup.sh

toBeWork.sh


Yayınlanma Tarihi: 2022-10-11 19:25:53

Son Düzenleme Tarihi: 2022-10-18 20:34:20