Zayıf C++ bilgimle istenilen dosyayı/klasörü istenilen klasöre yedekleyen bir program yazdım.
Ancak bu program öyle ahım şahım değil. Zaten Linux komut satırını kullanıyor. Linuxta konsola yazdığınız kodu kısmen bu program içerisine yazıyorsunuz. Bunu konsoldan da yapabilirim diyebilirsiniz, ancak isterseniz cronjob ile dilediğiniz zaman programın çalıştırılıp yedek almasını sağlayabilirsiniz. Ben bilgisayar kapanırken veya yeniden başlatılırken yedek almasını sağlamak için yapacağım bunu.
Programın kodları aşırı derece de amele usulü olabilir, kabulümdür. Malum üniversitemizde C++ öğreteceğiz dediler ama for,while ve bir kaç string fonksiyonu dışında hiçbirşey göstermediler. Buna rağmen araştırmacı kişilik olarak işimi görecek bu programı yazmayı başardım :) Kodların devamında açıklamalarda bulunacağım.
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <string.h> #include <time.h> using namespace std; int RunCommand(const char *strCommand) { int iForkId, iStatus; iForkId = vfork(); if (iForkId == 0) // This is the child { iStatus = execl("/bin/sh","sh","-c", strCommand, (char*) NULL); exit(iStatus); // We must exit here, // or we will have multiple // mainlines running... } else if (iForkId > 0) // Parent, no error { iStatus = 0; } else // Parent, with error (iForkId == -1) { iStatus = -1; } return(iStatus); } int main(int argc, char *argv[]) { int iNumProc = 0, iChildiStatus = 0, iStatus = 0, iDeadId = 0; int iExitFlag = 0; time_t rawtime; struct tm * timeinfo; char buffer [80]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,80,"%Y_%m_%d-%H.%M.tar.gz",timeinfo); //puts (buffer); //cout<<buffer; char command[100] = "tar cvzf "; char topath[100] = "/home/guven/yedekler/"; char tocompress[100] = "/home/guven/public_html/"; char topath2[200]; // Yedek oluşturulacak dosya strcat(topath2,topath);strcat(topath2,buffer); //komuta yedek dosyası ekleniyor strcat(command,topath2); strcat(command," "); //dosyaya sıkıştırılacak konum-dosya ekleniyor strcat(command,tocompress); //if (Exists( topath ) ) //{ clock_t baslangic = clock(); // performans bilgisi iStatus = RunCommand(command); if (!iStatus) iNumProc++; //} // Wait till the commands complete while (iNumProc && !iExitFlag) { iDeadId = waitpid(-1, &iChildiStatus, WNOHANG); if (iDeadId < 0) { // Wait id error - exit the loop iExitFlag = 1; } else if (iDeadId > 0) { iNumProc--; // You can check the process exit iStatus here - its in the // iChildiStatus variable } else // iDeadId == 0, no processes died { sleep(3); // give them time to die } } clock_t bitis = clock(); // performans bilgisi cout<<endl<<"Bu islem "<<(((double)bitis - (double)baslangic) / (double)CLOCKS_PER_SEC)<<" saniyede yapildi."<<endl; return 0; }
- Programın 52. satırındaki kodda yedeğin yapılacağı hedefi belirtiyorsunuz. Şöyle ki ben /home/guven/yedekler klasörüne atıyorum sıkıştırılmış dosyayı.
- 53. satırdaki kodda ise yedek alınacak dosya veya klasörü giriyorsunuz. Örneğin ben public_html klasörümü yedekliyorum.
- Programda klasörü/dosya var mı yok mu kontrolü bulunmuyor. Dolayısıyla hedef ve kaynak dosyalarınızın/klasörlerinizin mutlaka bulunması gerekmektedir, yoksa program hata verir ki normali de budur :)
- Yedek dosyasının ismi şu şekilde oluşturulmaktadır: 2011_01_18-19.31.tar.gz Yani Yıl_Ay_Gün-Saat.Dakika.tar.gz.
Şimdilik bunlar aklıma geldi, kafanıza takılan birşey olursa yorum bölümünden sorabilirsiniz. Bir sonraki yazımda bu programı bilgisayarın kapanış servislerine eklemeyi göstereceğim, tabii ki öncelikle bu işlemi doğru düzgün yapabilmem gerekecek :)
e iii :D
Ne ii :)
abi çok iyi ya :D