Linux’ta Sıkıştırılmış Yedek Oluşturma

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 :)

Kaynakça
Execute bash commands and running programs by c++

3 Comments

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir