# 작업 내용
 - 서버상에 생성한 일일 백업및 시스템로그 파일을, JAVA 프로세스를 이용하여 사용자의 로컬 PC에 다운로드 합니다.

# 필요 작업
1) 서버에 일일 백업및 시스템 로그 파일을 생성하는 스크립트를 작성하여 crontab 로 일정시간에 실행되도록 등록 합니다.

2) 서버상의 존재하는 백업 파일및 시스템 로그를 FTP로 접속하여 지정된 로컬 PC에 다운로드 합니다.
    # 서버에서 FTP 프로세스가 실행되고 있어야 합니다.


# 작업 내용
1) 일일 백업 스크립트 - 적용 OS : Linux

- 파일명 : daily_backup.sh
[backup@localhost ~]$ cat daily_backup.sh
TODAY=`date +%Y%m%d`
OLDDATE=`date --date '5 days ago' +%Y%m%d`

echo "$TODAY daily report" >> /home/backup/logs/$TODAY.log
echo "$OLDDATE old date" >> /home/backup/logs/$TODAY.log

DELETE_OLD_FILE="/home/backup/$OLDDATE.tar"
DELETE_OLD_LOG="/home/backup/logs/$OLDDATE.log"

echo "Date Backup Start~!" >> /home/backup/logs/$TODAY.log
tar -cvf - /home/free/webapps/WebContent/WEB-INF/ >  /home/data_backup/$TODAY.tar
echo "Date Backup End~!" >> /home/backup/logs/$TODAY.log

echo "" >> /home/data_backup/logs/$TODAY.log
echo "Old Data Delete Start~!" >> /home/backup/logs/$TODAY.log
rm $DELETE_OLD_FILE
rm $DELETE_OLD_LOG
echo "Old Data Delete End~!" >> /home/backup/logs/$TODAY.log

- 파일명 : daily_system_log.sh

[backup@localhost ~]$ cat daily_system_log.sh
#!/bin/sh
TODAY=`date '+%Y-%m-%d'`
OLDDATE=`date --date '30 days ago' +%Y-%m-%d`

# 현재 날자의 이름을 가진 txt 파일을 생성합니다.
echo "$TODAY daily report" >> /home/backup/report/report_$TODAY.txt
echo "$OLDDATE old date" >> /home/backup/report/report_$TODAY.txt

# 현재 날자로부터 30일 전의 파일을 삭제합니다.
DELETE_OLD_TXT="/home/backup/report/report_$OLDDATE.txt"
rm $DELETE_OLD_TXT

# NETWORK STATUS
# 생성된 파일에 용량확인 로그를 저장합니다.
echo " " >> /home/backup/report/report_$TODAY.txt
df -h >> /home/backup/report/report_$TODAY.txt
echo " " >> /home/backup/report/report_$TODAY.txt


- 파일명 : /etc/crontab
[backup@localhost ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

#  매일 새벽 1시에 backup 계정으로  daily_backup.sh를 실행
01 1 * * * backup /home/backup/daily_backup.sh

#  매일 새벽 1시에 backup 계정으로  daily_system_log.sh를 실행
01 1 * * * backup /home/backup/daily_system_log.sh


2) FTPClient 를 이용하여 파일 다운로드
 - Commons Net 라이브러리를 다운로드
 경로 : http://jakarta.apache.org/site/downloads/downloads_oro.cgi

Commons Net 라이브러리 사용법 펌글 :
http://develop.sunshiny.co.kr/266?category=8


 - 설정파일 정의 : Config.properties
############################################################################
#    FTP 서버및 로컬 환경 설정
#    2009.08.06 최초작성 - sunshiny
############################################################################

# 서버 URL, IP
server.ip = 192.168.1.123

# FTP 서버 접속 계정 정보
server.user = backup
server.passwd = 1234

# 서버상의 파일이 있는 위치
server.path = /

# 다운 파일 저장위치
local.path = D:/02.TEMP/

# 로그 파일 저장 위치
log.path = D:/02.TEMP/log/

# 원격 서버에서 백업할 파일명은 기본 "yyyyMMdd" 형식을 지켜야 하며,
# 확장자는 변경하여 사용 가능.
# 다운로드시 파일명 변경. 저장 예) day_20090806.tar
download.file.name = day_

# 다운로드할 파일 확장자 설정(원격 서버와 동일)
download.file.type = tar

# 다운로드한 파일삭제 주기 (입력형식 1~100 숫자)
# 공백일경우 삭제 없음.
download.file.delete = 6

############ 서버 용량확인 텍스트 파일 설정 ###############

# 서버상의 로그 파일이 있는 위치
system.log.path = report/

# 저장(다운로드) 위치
local.log.path = D:/02.TEMP/daily_log/

# 삭제 주기 (입력형식 1~100 숫자)
# 공백일경우 삭제 없음.
local.log.delete = 30


# 로컬 PC 에 다운로드 예약을 실행시에
cmd 파일또는 bat 파일을 생성하여 아래와 같이 commons-net, Main 클래스 파일 위치를 설정 해줍니다.
그 후에 윈도우에 있는 예약설정을 이용하여 해당 cmd 또는 bat 파일을 선택 해줍니다.

 - 파일명 : start_backup.cmd
java -classpath "D:\temp\backup\lib\commons-net-2.0.jar;D:\temp\backup\bin" Main


# 이후 JAVA 파일은 소스를 참고.

 - 전체 소스 다운로드 -





09 1, 2009 10:17 09 1, 2009 10:17

Trackback URL : http://develop.sunshiny.co.kr/trackback/293

Leave a comment


Commons Net의 FTPClient 사용하기 | JSP 2005/10/14 15:22  
from http://www.jakartaproject.com/article/jakarta/1113911351166

 

I. Commons net

Jakarta Commons의 net은 network utility collection입니다.
인터넷 프로토콜을 대부분지원하는 강력한 유틸리티로 사용이 쉽고 간결합니다.

클라이언트측의 기본적인 Internet protocol을 구현함으로서 고차원적인 abstract가 아닌

기본적인 프로토콜 access가 목적이기 때문에 부분적으로 object-orient 규칙에 위배되는

사항이 있다는것을 참고적으로 알자.

Commons net이 지원하는 프로토콜은 다음과 같다.

FTP
NNTP
SMTP
POP3
Telnet
TFTP
Finger
Whois
rexec/rcmd/rlogin
Time (rdate) and Daytime
Echo
Discard
NTP/SNTP


FTP의 경우 이전에는 Sun 패키지의 FtpClient를 사용했지만 이제는
Commons net의 FTP를 사용해 봅시다.

 

II. 준비물

Commons net은 자체적으로 ORO를 사용합니다.

Jakarta ORO란 파일이름의 치환, 분할, 필터링 등을 수행하기 위한 Perl5 호환 정규식, AWK와 같은 정규식, glob 표현, 그리고 유틸리티 클래스들을 제공하는 텍스트 처리 자바 클래스들입니다.

   Commons net http://jakarta.apache.org/site/downloads/downloads_commons-net.cgi
   Jakarta ORO http://jakarta.apache.org/site/downloads/downloads_oro.cgi

참고자료
   Commons net API http://jakarta.apache.org/commons/net/apidocs/index.html
   Commons net http://jakarta.apache.org/commons/net/

 

III. org.apache.commons.net.ftp 의 흐름

Sun 패키지의 FTPClient처럼 FTP여러 동작을 Commons net의 FTPClient로 구현해 보자.

다음 ① ~ ⑦까지 목록은 필수항목으로 구현되어야 합니다.

논리적으로 보면 간단합니다.


① FTPClient 생성
   먼저 가장 중심적인 역할을 하는 FTPClient를 생성합니다.
   FTPClient ftpClient = new FTPClient();

② FTPServer에 Connect
   서버에 연결을 합니다.
   ftpClient.connect(server);

③ 응답이 정상적인지 확인 합니다.
   응답을 받아와서
   int reply = ftpClient.getReplyCode();

   정상적인지 확인해 봅니다.
   if (!FTPReply.isPositiveCompletion(reply)) {
      정상적이지 않으면 연결을 끊고 종료 합니다.
      ftpClient.disconnect();
      System.out.println("FTP server refused connection.");
   }  else {
      정상적이면 계속 진행 합니다
      System.out.println("Connect successful");
      ...
   }

④ FTP Server 로그인
   ftpClient.login(username, password);

⑤ 여러가지 작업을 합니다
   list, get, put...

⑥ FTP Server 로그아웃
   ftpClient.logout();

⑦ FTP Server disconnect
   ftpClient.disconnect();


IV. 사용예제 - 목록보기
본격적으로 FTP에 접속하여 목록을 가져오는 소스를 봅시다.
FTPClient ftpClient = null;
try {
    ftpClient = new FTPClient();
    ftpClient.setControlEncoding("euc-kr");  // 한글파일명 때문에 디폴트 인코딩을 euc-kr로 합니다
    ftpClient.connect("user.chollian.net");  // 천리안 FTP에 접속합니다

    int reply = ftpClient.getReplyCode(); // 응답코드가 비정상이면 종료합니다
    if (!FTPReply.isPositiveCompletion(reply)) {
        ftpClient.disconnect();
        System.out.println("FTP server refused connection.");   
    } else {
        System.out.print(ftpClient.getReplyString());  // 응답 메세지를 찍어봅시다


        ftpClient.setSoTimeout(10000);  // 현재 커넥션 timeout을 millisecond 값으로 입력합니다
        ftpClient.login(username, password); // 로그인 유저명과 비밀번호를 입력 합니다

        // 목록보기 구현

        FTPFile[] ftpfiles = ftpClient.listFiles("/public");  // public 폴더의 모든 파일을 list 합니다
        if (ftpfiles != null) {
            for (int i = 0; i < ftpfiles.length; i++) {
                FTPFile file = ftpfiles[i];
                System.out.println(file.toString());  // file.getName(), file.getSize() 등등..
            }
        }

        ftpClient.logout();
    }

} catch (Exception e) {
    System.out.println(e);
    e.printStackTrace();
} finally {
   if (ftpClient != null && ftpClient.isConnected()) {
       try {
           ftpClient.disconnect();
       } catch (IOException ioe) {
           ioe.printStackTrace();
       }
}


목록보기 방법에는 한가지 방법이 더 있습니다.

위의 코드는 해당 디렉토리내의 모든 파일을 가져오는 방법이며

다음 방법은 해당 디렉토리의 모든 파일을 정해진 수로 짤라 가져오는 방법이 있습니다.

위의 빨간색 코드대신 다음 코드가 들어갈 수 있습니다.


    int page = 1;
    FTPListParseEngine engine = ftpClient.initiateListParsing("/public"); // 목록을 나타낼 디렉토리
    while (engine.hasNext()) {
        FTPFile[] ftpfiles = engine.getNext(10); // 10개 단위로 끊어서 가져온다


        System.out.println("------------------------ "+page+" ------------------------");   

        if (ftpfiles != null) {
            for (int i = 0; i < ftpfiles.length; i++) {
                 FTPFile file = ftpfiles[i];
                 System.out.println(file.toString());
           }
        }
        System.out.println("------------------------ "+(page++)+" -------------------------");
    }

 

V. 사용예제 - get (파일 다운로드)

서버의 /public/테스트.txt 파일을 클라이언트의 C:\\Test\\테스트.txt 에 다운받는 예제.

    File get_file = new File("C:\\Test\\테스트.txt"); 
    OutputStream outputStream = new FileOutputStream(get_file);
    boolean result = ftpClient.retrieveFile("/public/테스트.txt", outputStream);

    outputStream.close();

 

VI. 사용예제 - put(파일 업로드)

클라이언트의 C:\\Test\\보내자.txt 파일을 서버의 /public/보내자.txt 에 업로드하는 예제.
만일 서버에 이미 /public/보내자.txt 파일이 있다면 덮어쓰게 된다.
    File put_file = new File("C:\\Test\\보내자.txt");
    inputStream = new FileInputStream(put_file);
    boolean result = ftpClient.storeFile("/public/보내자.txt", inputStream);
    inputStream.close();

 

VII. 사용예제 - append (파일업로드)
위의 예제와 같은 기능을 하지만 이미 파일에 동일한 파일이 있으면 false를 반환하면서 실행하지 않는다
    File append_file = new File("C:\\Test\\더해라.txt");
    inputStream = new FileInputStream(append_file);
    boolean result = ftpClient.appendFile("/public/더해라.txt", inputStream);
    inputStream.close();

 

VIII. 사용예제 - rename (파일 이름변경)

변경전 파일명과 변경할 파일명을 파라미터로 준다.
    boolean result = ftpClient.rename("/public/바꾸기전파일.txt", "/public/바꾼후파일.txt");

 

IX. 사용예제 - delete (파일삭제)

삭제할 파일을 선택한다     .
    boolean result = ftpClient.deleteFile("/public/test.txt");

 

X. 사용예제 - directory 생성

/public 에 oops 디렉토리를 생성한다.
    boolean result = ftpClient.makeDirectory("/public/oops");

 

XI. 사용예제 - OS 커맨드 입력하기

/public 에 oops 디렉토리를 생성한다
    ftpClient.sendCommand(FTPCommand.MAKE_DIRECTORY, "/public/oops");
    sendCommand 함수에 FTPCommand의 실행할 OS명령을 static 멤버변수를 넘겨준다

 

XII. 사용예제 - 작업디렉토리 설정하기

작업디렉토리를 /public 설정한 후 oops 디렉토리를 설정한다 (위의 예제와 비교해보라!)
    ftpClient.changeWorkingDirectory("/public");
    boolean result = ftpClient.makeDirectory("oops"); // /public/oops 절대경로를 적지 않아도 된다


XIII. 사용예제 - 파일 및 전송형태 설정

파일 형태 설정
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);


파일 타입

FTP.BINARY_FILE_TYPE, FTP.ASCII_FILE_TYPE, FTP.EBCDIC_FILE_TYPE,
FTP.IMAGE_FILE_TYPE , FTP.LOCAL_FILE_TYPE

이 값을 설정하지 않으면 디폴트는 ASCII 이다.


전송 형태 설정
ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);


전송 타입
FTP.BLOCK_TRANSFER_MODE, FTP.COMPRESSED_TRANSFER_MODE 

이값을 설정하지 않으면 디폴트는 FTP.STREAM_TRANSFER_MODE 이다.


 

출처 : http://www.javaservice.net   조성대(GoodBug)님의 글

08 5, 2009 15:51 08 5, 2009 15:51

Trackback URL : http://develop.sunshiny.co.kr/trackback/266

Leave a comment


Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217714 HIT
TODAY 16 HIT
YESTERDAY 115 HIT