안녕하세요^^
산이님 아래 스크립트좀 봐주세요..
아래대로 컴파일해서 백업스크립트를
돌리는데..
날짜별로 백업이 되지 않고 처음에 생성한 폴더만 계속 찾아
생성시도하다가
실패합니다.
예를들면 2003년 09월 23일에 백업된 폴더가 있다면...
그 다음날부턴 계속 2003-09-23 폴더만 생성하려고 하죠.
도대체 이유가 뭘까요...
지금은 크론으로 백업시간 5분전에 전날 폴더를 삭제해주는
방식으로 돌리고 있거든요..
후우움.. 불편하긴 하네요....
아래는 소스 입니다.
파일도 링크시켜 두겠습니다.
http://www.inet1004.net/backup.c
------------------------------------------------------------------------------------
--------
#include <stdio.h>
#include <time.h>
#include <dirent.h>
#include <string.h>
/*---------------- 사용자가 고쳐야 할 부분
-------------------------------------------------
*/
const char *BACKUP_DIR = "/backup"; //백업파일이
저장될 폴더을 절대경로로 지정해
줍니다.
const char *HOME_DIR = "/home"; //백업할
홈폴더를 지정해 줍니다.
const int EXPIRE_DAY = 3; //몇일이 지나면
삭제할건지를 지정합니다.
/*----------------------------------------------------------------------------------
--------
*/
/* php 의 mktime 과 같은 일을 하는 펑션. */
time_t SFmktime(int hour, int minute, int second, int month, int day, int year){
struct tm *change_time;
time_t this_time;
time(&this_time);
change_time = gmtime(&this_time);
year = year - 1900;
month = month - 1;
change_time->tm_sec = second;
change_time->tm_min = minute;
change_time->tm_hour = hour;
change_time->tm_mday = day;
change_time->tm_mon = month;
change_time->tm_year = year;
//printf("%02d-%02d-%02d\n",change_time->tm_year +
1900,change_time->tm_mon
+1,change_time->tm_mday);
return mktime(change_time);
}
/* main --------------------------------------------*/
int main(){
//time_t now;
time_t today_second; //오늘의 시간을 초로 저장받을
변수
time_t pastday; // 디렉토리목록을
날짜로 변환한 후 저장받을 변수, 계속 바뀜
struct tm *today;
DIR *directory; // 디렉토리 저장공간.
struct dirent *dir_info; //디렉토리 이름을 저장할
구조체
char *remove_dirname;
char *create_dirname;
char *cmds;
char sep[] = "-"; // 날짜 자를 구분자.
char *pp; // 임시로 잘려진 날짜.
int i, expire_second;
char *year, *month, *day;
char days[11];
// 백업디렉토리이름을
저장할 메모리를 초기화 한다.
remove_dirname = (char*)malloc(40);
create_dirname = (char*)malloc(40);
cmds = (char*)malloc(1024);
// 시간 구조체를 초기화 시키고
time(&today_second);
today = gmtime(&today_second);
// 오늘일자를 초로 환산하여 저장한다.
// today_second
today_second = SFmktime(0,0,0,today->tm_mon +
1,today->tm_mday,today-
>tm_year + 1900);
printf("=================================================================\n&quo
t;);
printf(" %d-%d-%d 일자 백업스크립트 작동
정보입니다.\n",today-
>tm_year+1900,today->tm_mon+1,today->tm_mday);
printf("=================================================================\n&quo
t;);
//printf("%d\n",today_second);
// 우선 백업할 디렉토리내에 있는 폴더의 이름을
불러 directory 에 저장한다.
directory = opendir(BACKUP_DIR);
//배열이 종료될때까지 루프를 돌린다.
디렉토리명을 dir_info 구조체에 저장한다.
while((dir_info = readdir(directory)) != NULL){
// 만약 디렉토리 이름이 . or .. or logs 라면
넘어간다.
if(strcmp(".",dir_info->d_name) == 0 ||
strcmp("..",dir_info->d_name) == 0 ||
strcmp("logs",dir_info->d_name) == 0){
continue;
}
// 디렉토리명을 "-" 구분자로
잘라내서 초를 뽑아낸후 오늘의 초와 비교한다.
strncpy(days,dir_info->d_name,11);
pp = strtok(days,sep);
i =0;
while( pp != NULL){
if(i == 0)year = pp;
if(i == 1)month = pp;
if(i == 2)day = pp;
pp = strtok(NULL,sep);
i++;
}
// 날짜 형식에 맞지 않는 폴더명이 나오면
다음 폴더확인으로 넘어간다.
if(atoi(year) == 0 || atoi(month) == 0 || atoi(day) == 0){
printf("백업형식에
맞지않는 폴더명 [%s] 입니다. 무시합니다.\n",dir_info-
>d_name);
printf("-----------------------------------------------------\n");
continue;
}
printf("%02d-%02d-%02d 일자의 폴더가
존재합니다\n",atoi(year),atoi(month),atoi
(day));
// 디렉토리의 날짜를 초로 변환하여 저장됨.
pastday = SFmktime(0,0,0,atoi(month),atoi(day),atoi(year));
expire_second = 86400 * EXPIRE_DAY;
//printf("%d - %d = %d\n",today_second, pastday,
today_second-pastday);
if((today_second - pastday) > expire_second){
printf("삭제대상폴더:[%s]
%d일 경과\n",dir_info->d_name,
(today_second-pastday)/86400);
//삭제작업을 한다.
sprintf(remove_dirname,"%s/%s",BACKUP_DIR,dir_info->d_name);
printf(" %s 를
삭제합니다...\n",remove_dirname);
if(rmdir(remove_dirname)){
printf("삭제실패!
에러메세지를 확인하여 주십시오\n");
printf("-----------------------------------------------------
\n");
exit();
}
printf("-----------------------------------------------------\n");
}// end if
}
closedir(directory);
// 불러온 디렉토리명을 한줄씩 저장한 후 년도와 월 일로
나누어 저장한다.
sprintf(create_dirname,"%s/%02d-%02d-%02d",BACKUP_DIR,today->tm_year+1900,
today-
>tm_mon+1,today->tm_mday);
printf("폴더 %s 를 생성합니다..\n",create_dirname);
if(mkdir(create_dirname,0700)){
printf("생성실패!
에러메세지를 확인하여주십시오\n");
exit();
}
//백업폴더 명령 저장
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/usr.local.tar.gz /usr/local/
>> /var/log/backup.log 2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today-
>tm_mon+1,today->tm_mday);
printf("%s\n",cmds);
system(cmds);
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/etc.tar.gz /etc >>
/var/log/backup.log
2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today->tm_mon+1,today-
>tm_mday);
printf("%s\n",cmds);
system(cmds);
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/var.tar.gz /var >>
/var/log/backup.log
2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today->tm_mon+1,today-
>tm_mday);
printf("%s\n",cmds);
system(cmds);
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/db.tar.gz /db >>
/var/log/backup.log
2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today->tm_mon+1,today-
>tm_mday);
printf("%s\n",cmds);
system(cmds);
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/sys.tar.gz /sys >>
/var/log/backup.log
2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today->tm_mon+1,today-
>tm_mday);
printf("%s\n",cmds);
system(cmds);
//home 폴더의 목록을 불러와 저장한다.
directory = opendir(HOME_DIR);
//배열이 종료될때까지 루프를 돌린다. 디렉토리명을
dir_info 구조체에 저장한다.
sprintf(create_dirname,"%s/%02d-%02d-%02d/home",BACKUP_DIR,today-
>tm_year+1900,today->tm_mon+1,today->tm_mday);
if(mkdir(create_dirname,0700)){
printf("생성실패!
에러메세지를 확인하여주십시오\n");
exit();
}
while((dir_info = readdir(directory)) != NULL){
// 만약 디렉토리 이름이 . or .. or logs 라면
넘어간다.
if(strcmp(".",dir_info->d_name) == 0 ||
strcmp("..",dir_info->d_name) == 0 || strcmp
("logs",dir_info->d_name) == 0){
continue;
}
sprintf(cmds,"tar cvfpz %s/%02d-%02d-%02d/home/%s.tar.gz %s/%s
>> /var/log/backup.log 2>>
/var/log/backup.err.log",BACKUP_DIR,today->tm_year+1900,today-
>tm_mon+1,today->tm_mday,dir_info->d_name,HOME_DIR,dir_info->d_name);
printf("%s\n",cmds);
system(cmds);
}//end of while
sprintf(cmds,"chmod -R 0600 %s/%02d-%02d-%02d",BACKUP_DIR,today-
>tm_year+1900,today->tm_mon+1,today->tm_mday);
system(cmds);
system("echo \"백업완료\"
>> /var/log/backup.log");
}
|