2018. 4. 24. 11:49


앞에 만든 오라클 백업 스크립트를 자동으로 cron에 넣어주고, 


매일 백업하게 해주는 cron를 작성하겠다.


오라클백업 스크립트 만들기

http://tyson.tistory.com/113


===========================================================================

퍼온거

crontab 명령어

crontab [ -u 사용자 id] 파일
crontab [-u 사용자 id] { -l | -r | -e}

  • crontab -l : 예약된 작업리스트
  • crontab -e : 예약된 작업 수정
  • crontab -r : 예약된 작업 삭제
  • crontab -u 사용자명 : 루트관리자는 해당 사용자의 crontab 파일을 보거나 삭제, 편집가능

등록 내용 설정

"분,시,일,월,요일,[사용자명] 실행명령" 순으로 설정

crontab 파일 형식

------    --------  ---------------------------------------------------

필  드    의  미    범  위

------    --------  ---------------------------------------------------

첫번째    분        0-59

두번째    시        0-23

세번째    일        0-31

네번째    월        1-12

다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)

여섯번째  사용자명  /etc/crontab, /etc/cron.d 에 저장될 경우 필요

일곱번째  작업명령  실행할 명령을 한줄로 쓴다.

------    --------  ---------------------------------------------------


예)

45,5 10 * * 1-5 root /usr/bin/rdate -s time.bora.net && clock -w

월요일~금요일에 매월 매일 10시 5분과 45분에 루트의 권한으로 시간동기화 명령어를 실행한다.

  • * : 범위 내 모든 경우
  • 숫자 : 정확히 일치하는 그 시각, 날짜
  • '-' 기호로 연결된 두 숫자 : 두 숫자 사이에 포함된 범위를 뜻함
  • 콤마(,)로 구분돼 나열된 숫자 : 나열된 숫자 중 일치하는 경우를 뜻함



출처: http://webdir.tistory.com/174 [WEBDIR]


============================================================================

퍼온거 


$ crontab -e

그러면 뭔가 편집할 수 있는 곳이 로딩됩니다. 이곳이 바로 크론탭을 설정할 수 있는 장소이죠. 여기에 각종 크론탭 명령어를 입력후 콜론(:) 입력 후에 wq 를 입력해 크론탭을 갱신시킵시다.

반대로 현재 크론탭에 어떤 내용이 들어있는지 보려면 다음처럼 입력하세요.

$ crontab -l

그러면 cat 명령어로 파일을 읽어들인 것처럼 표준 출력으로 크론탭 내용이 나오게 됩니다. 그런데 만약(거의 없겠지만) 크론탭을 지우고 싶다면?

리눅스 쉘에 다음처럼 입력합니다.

$ crontab -d

이렇게까지 하면 크론탭의 기본 설정 및 확인, 삭제에 대해 배운 것입니다. 그러면 실제로 크론탭에 크론 하나를 예제로 등록 해봅시다.




주기 결정


*      *      *      *      *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

각 별 위치에 따라 주기를 다르게 설정 할 수 있습니다. 순서대로 분-시간-일-월-요일 순입니다. 그리고 괄호 안의 숫자 범위 내로 별 대신 입력 할 수 있습니다.

요일에서 0과 7은 일요일입니다. 1부터 월요일이고 6이 토요일입니다.


요일은 0부터 시작합니다.



1. 매분 실행

# 매분 test.sh 실행
* * * * * /home/script/test.sh

2. 특정 시간 실행

# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh

3. 반복 실행

# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh

4. 범위 실행

# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh

5. 간격 실행

# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh

6. 조금 복잡하게 실행

# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh



크론 로깅 (cron logging)

크론탭을 사용해서 정기적으로 작업을 처리하는 것은 좋은데, 해당 처리 내역에 대해 로그를 남기고 싶을 때가 있을겁니다. 그럴때 다음처럼 한번 써봅시다.

* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1

위처럼 작성하면 매분마다 test.sh.log 파일이 갱신 되어 작업 내용이 어떻게 처리 되었는지 알 수 있습니다. 만약 2>&1 을 제거하면 쉘스크립트에서 표준 출력 내용만 나옵니다. 2>&1은 이곳에서 확인합시다.

그런데, 이게 너무 자주 실행 되고 또한 지속적으로 로깅이 되야 해서 로그를 계속 남겨둬야 한다면 다음처럼 입력합니다.

* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1

그러면 계속 로그가 누적이 되는 것을 확인 할 수 있을겁니다. 대신 로그가 과도하게 쌓이면 리눅스 퍼포먼스에 영향을 주므로 가끔씩 비워주거나 파일을 새로 만들어주는 센스가 필요합니다.

반대로 로그는 필요 없는 크론을 위해선 다음처럼 입력합니다.

* * * * * /home/script/test.sh > /dev/null 2>&1




위에꺼는 퍼온겁니다.


펌:  http://jdm.kr/blog/2

============================================================================


저같은 경우 매일 새벽에 돌리고 싶어서, 아래와 같이 만들었습니다.


# 새벽 1시에 매일 실행시키기 0 1 * * * /bin/sh /home/oracle/backup/cron/db_backup.sh



위에처럼 하면 매일 실행 합니다.





Posted by Tyson
2018. 2. 23. 12:08

GCP에서 yum install nodejs로 했더니...버젼이..


0.10.24 인가 그랬던거 같다.



그래서 업데이트를 해야했다.


다음 절차에 따라서 업데이트를 진행하세요.

  • 현재 NodeJs 버전 확인하기
    $ node -v
    v5.6.0
    
  • 강제로 캐시 삭제
    $ sudo npm cache clean -f
    npm WARN using --force I sure hope you know what you are 
  • n 모듈 설치
    $ sudo npm install -g n
    /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
    /usr/local/lib
    └── n@2.1.0
  • n 모듈을 사용하여 Nodejs 설치 (다른 버전의 Node.js 를 설치하려면 sudo n 5.11.0 이런식으로 명령어를 입력하면 됩니다)
    $ sudo n stable
    
         install : node-v6.0.0
           mkdir : /usr/local/n/versions/node/6.0.0
           fetch : https://nodejs.org/dist/v6.0.0/node-v6.0.0-linux-x64.tar.gz
    ######################################################################## 100.0%
       installed : v6.0.0
  • 새로운 Node.js 버전 확인하기
    $ node -v
    v6.0.0


NPM 업그레이드

  • 현재 npm 버전 확인하기
    $ npm -v
    3.6.0
  • npm 으로 npm 설치 (인셉션..)
    $ sudo npm install -g npm
    /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
    /usr/local/lib
    └── npm@3.8.8
  • 새로운 npm 버전 확인하기
    $ npm -v
    3.8.8




<원본: https://velopert.com/1351 여기서 퍼온겁니다.>






Posted by Tyson
2018. 2. 22. 20:07



$ node -v

-bash: node: command not found

라고 뜨면 설치가 안된거다.


CentOS에서는 


$ yum insall nodejs

하면 된다.


근데, 이런 에러가 뜬다


> node -v 


node: error while loading shared libraries: libv8.so.3: cannot open shared object file: No such file or directory



이게 먼가 했는데, 머가 설치가 안된거다.


그래서 npm을 설치 했더니 없어진다.




$ yum insall npm

하면, 100개정도 설치한다.














Posted by Tyson
2018. 2. 22. 19:12

먼저 Nginx의 폴더 구조에 대해서 설명하겠다.


/etc/nginx   : 여기는 설정파일들이있음.

/etc/nginx/conf.d  : 기본설정 파일이 들어있음.

/usr/share/nginx/html : 기본 띄우는 html파일폴더

/var/log/nginx : 로그파일들이다.




/etc/nginx/nginx.conf 가 기본 설정 파일임.



여기 안에 보면, 

> vi nginx.conf


include 가 있다.


# For more information on configuration, see:

#   * Official English Documentation: http://nginx.org/en/docs/

#   * Official Russian Documentation: http://nginx.org/ru/docs/


user nginx;

#user root;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;


# Load dynamic modules. See /usr/share/nginx/README.dynamic.

include /usr/share/nginx/modules/*.conf;


events {

    worker_connections  1024;

}



http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';


    access_log  /var/log/nginx/access.log  main;


    sendfile            on;

    tcp_nopush          on;

    tcp_nodelay         on;

    keepalive_timeout   65;

    types_hash_max_size 2048;


    include             /etc/nginx/mime.types;

    default_type        application/octet-stream;


    # Load modular configuration files from the /etc/nginx/conf.d directory.

    # See http://nginx.org/en/docs/ngx_core_module.html#include

    # for more information.

    include /etc/nginx/conf.d/*.conf;

    include /etc/nginx/site-available/*.conf;


}




include /etc/nginx/conf.d/*.conf 

는 conf.d폴더의 .conf로 끝나는 파일은 다 저 자리에 넣는거다.


그래서, 관리하는 사이트 만 밑에처럼 작성해서 test.conf 이런식으로 넣어 놓으면 각 서버 정보가 추가되는거다.




server {

    listen 80;


    server_name test.com;

    root /usr/share/nginx/html;


    location / {

        include /etc/nginx/uwsgi_params;

        proxy_pass http://127.0.0.1:3000;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection 'upgrade';

        proxy_set_header Host $host;

        proxy_cache_bypass $http_upgrade;

    }

}



자, 위에꺼는 80 포트, test.com으로 들어오면, 

로컬호스트 3000포트로 보내라는 건데,


여기서 계속 에러가 뜨는거다..


2018/02/22 09:40:25 [crit] 25667#0: *6 connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream, client: 112.111.11.11, server: test.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3000/", host: "test.com"


이런식의 로그가 게속 뜨는거다.


여기서 미치는거다. 권한 문제인가 해서...폴더들 권한 등등 다 넣었는데, 안되는거다.....


아무리 찾아도 없고........


그러다가 방화벽쪽 문제인거 같더라.


SELinux에서 포트포워딩을 막는거 같아서, 




$setsebool httpd_can_network_connect on

위에처럼 해주니까, 바로 프록시포트가 먹힌다.


진짜 이거 찾는데, 엄청 오래 걸렸다!!




<https://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx

 여기 참조>


I’ve run into this problem too. Another solution is to toggle the SELinux boolean value for httpd network connect to on (Nginx uses the httpd label).

setsebool httpd_can_network_connect on

To make the change persist use the -P flag.

setsebool httpd_can_network_connect on -P

You can see a list of all available SELinux booleans for httpd using

getsebool -a | grep httpd





Posted by Tyson
2018. 2. 22. 12:38

Linux Version 확인

1
cat /etc/*release*


NGINX 설치
>yum install nginx

NGINX 실행
>service nginx start

php설치
>yum install yum-priorities
yum-priorities 설치 php5.3으로 설치
>yum install php php-cli php-common php-fpm php-mysql

PHP 연동

1
vi /usr/share/nginx/html/info.php

이곳에 아래 내용을 붙여 넣는다. (PHP 코드)

1
2
3
<?php
phpinfo();
?>

NGINX 설정 변경

1
vi /etc/nginx/conf.d/default.conf

아래 내용을 넣는다. (이미 주석처리 되어 있으므로 주석을 풀어 준다.)
단!! fastcgi-param 부분과 root 부분의 코드가 주석과 다르니 주의 한다.!!

1
2
3
4
5
6
7
location ~ \.php$ {
  root           /usr/share/nginx/html;
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}

이제 nginx 재기동 하면, (service nginx restart)
info.php 접속하면 정상으로 보여야 한다.


근데, 이렇게 하면, nginx에서 안뜸..

php-fpm를 실행시켜줘야함.

  1. nginx.conf

    location ~ \.php$ {
                root           html;
                #fastcgi_pass   127.0.0.1:9000;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                include        fastcgi_params;
            }
  2. /etc/php-fpm.d/www.conf 

    ;listen = 127.0.0.1:9000
    listen = '/var/run/php5-fpm.sock'
      
    listen.owner = nginx
    listen.group = nginx
    listen.mode = 0660
      
    user = nginx
    group = nginx
  3. service 구동

    chkconfig php-fpm on
    chkconfig nginx on
    service php-fpm restart
    service nginx restart


시작할때, php-fpm 이랑, nginx를 실행되게 해줌.




참고블로그 :

http://jongkwang.com/?p=941

https://www.lesstif.com/pages/viewpage.action?pageId=24444977










Posted by Tyson
2018. 2. 20. 12:06

GCP에서 프로젝트생성하고, 인스턴스 생성하면,


대쉬보드에서 아래와 같이 확인할 수 있다.





위에 "Compute Engine" 인스턴스를 클릭하면,


밑에 하면처럼 인스턴스 목록이 나온다.



이름을 클릭하면, 생성한 인스턴스 상태를 볼수있고, 


외부 IP가 외부에서 접속하는 아이피이다.


나중에 도메인 연결 및 ssh로 접속할때 사용하니까, 확인해놓자~!!



그리고 클릭하면, 아래와 같이 새부정보를 볼수있는데,


밑에 "SSH"를 클릭하면 터미널이 열린다.





밑에처럼 새 창이 열리고, 로딩하는데 좀 오래 걸린다.





아래와 같이 접속이 된다.


웹에서 일반 터미널처럼 작업할 수 있다.




하지만, Putty나 iTerm를 써서 따로 접속하고 싶은 사람들은 밑에작업을 해주기 바란다.


개인적으로 키파일을 받아서 접속해도 되는데, 여러군데에서 작업할때, 패스워드치고 접속하고 싶으면 아래와 같은 작업을 해줘야한다.


터미널차에서,


> sudo passwd

를 치고, 원하는 패스워드를 친다.


재입력까지 두번입력해주면, 성공했다고 뜬다.



> su - 

를 치고 방금 입력한 패스워드를 입력해서, root로 접속한다.




> vi /etc/ssh/sshd_config

를 쳐서 sshd_config파일을 연다.





위에 보면,

PermitRootLogin no

PasswordAuthentication no


라고 되어 있는 곳을 yes로 바꿔준다.


Vi 에디터를 써본적이 없는 분을 위해 설명해주면,


i 를 누르면 입력모드로 바뀐다. 

그다음에 no를 지우고 yes로 바꿔준다.


esc키를 누르고, :wq 를 입려해서 저장하고 나온다.


그다음에는 sshd를 재시작해줘야 먹힌다.




> service sshd restart 

를 치면 재시작이 된다.


그리고, 자신이 쓰는 터미널 프로그램에서, 아까 대쉬보드에서 확인했던, 외부아이피로 접속을 해본다.


ssh root@102.102.102.102 이렇게 하고, 암호를 치면 접속된다.


 










Posted by Tyson
2018. 2. 1. 12:55

$ ./test_copy.sh &

내가 만든 sh 파일을 백그라운드로 계속 돌리고 싶다.


그래서 위처럼 하면 백그라운드에서 작업한다.



실행명령어 뒤에 & 붙이면 된다.


근데, 터미널 접속이 끊이면 이 작업도 중지된다.



$ nohup ./test_copy.sh &


어떤사람들은 &만 붙이면 끊겨도 괜찮다던데,


난 계속 끊기면 작업을 안하길래,


알아보니,


요즘은 옵션에서 nohup같이 동작하게 설정되어있어서 유지한다고 한다.


리눅스마다 이거는 틀리니까, 확인해봐야할것이다.


대부분은 끊여서 nohup를 한다.



근데, 웃긴건, nohup를 써도 터미널 접속이 끊겨도 그럴떄가 있다는것다.


그럴때는 


실행을 한다음에,


엔터를 쳐서, 터미널에서,


$ disown -h

이라는 명령어를 치면, 계속 유지한다.



처음에 백그라운드 작업으로 시작을 못했다면,


'Ctrl + z' 를 눌러서 정지 시킨다음에 shell로 돌아가는데,


'bg' 를 눌러서, 백그라운드로 보낸다. (작업을 복귀하고 싶을때는 'fg %1'를 친다.) 


그다음에 


'disown -h' 를 쳐도 된다.




작업 리스트 확인하기.


$ jobs


$ ps -ef | grep test_copy.sh


$ ps -ef | grep 실행중인 명령어 또는 파일명


 



작업 강제종료, 죽이기.


$ kill -9 아이디번호


 

위에 ps로 해서 나온 id 번호로 kill를 써서 죽이면 된다.


Posted by Tyson
2018. 2. 1. 12:12

폴더를 다른 폴더로 백업 받아 놓으려고 하는데, 폴더별로, 어느정도 작업이 되고 있는지 보고 싶은데,


이게 용량이 몇테라씩 하다보니까, 하나끝내고 하나 끝내는거 


보고 있기가 너무 빡세서, 


그냥 쉘 스크립트로 만들었다.


먼저 


test, test2, test3 폴더 3개를  test_copied 폴더로 복사할꺼다.


$> cp -rv --preserve=timestamps /volume1/shared/test/test /volume1/shared/test/test_copied


$> cp [옵션]  [원본위치]  [복사될위치]


-r 은 하위폴더 포함이고,

-v 는 보기 좋게 나오는거고,

--perserve=simestamps 는 원본에 있는 생성 시간은 유지하고 복사하는거다.



먼저 복사를 원하는데 가서,



$ vi test.sh


를 쳐서 에디터로 들어간다.


/volume1/shared/test/test폴더를  /volume1/shared/test/test_copied 폴더로 복사할것이다.


i를 눌러서 편집 입력 모드로 만들고,


아래처럼 쓴다.


cp -rv --preserve=timestamps /volume1/shared/test/test /volume1/shared/test/test_copied

echo "Finish test1" >> cp_log.txt

cp -rv --preserve=timestamps /volume1/shared/test/test2 /volume1/shared/test/test_copied

echo "Finish test2" >> cp_log.txt

cp -rv --preserve=timestamps /volume1/shared/test/test3 /volume1/shared/test/test_copied

echo "Finish test3" >> cp_log.txt





먼저 test폳더 복사후 cp_log.txt에 "Finish Test1"이란 로그를 남겨 놓는다.

그다음에 test2폴더를 복사후 로그를 남기고, test3도 마찮가지이다.


$> echo "Finish test1" >> cp_log.txt


여기에서 echo는 문자 출력이고, >>는 cp_log.txt파일에 추가하라는 이야기다.( '>' 두개임)


여기에서 > 를 한번만 쓰면, 이전꺼는 지우고, 마지막 문자만 들어간다.



작성후, 'ESC'를 눌르고,   :wq 를 입력후 나온다.


그다음에 copy.sh를 실행하는 방법은 아래 3가지 방법이 있다.


$ ./copy.sh


$ sh copy.sh


$ bash copy.sh

난 개인적으로 ./copy.sh로 실행을 했다.


실행을 하면 권한이 없다는 말이 나올것이다.


그러면 아래와 같이 권한을 준다.


$ chmod 700 copy.sh

를 친다.



그다음에 다시



$ ./copy.sh

를 실행한다.


백그라운드로 작업하고 싶으면, 


$ ./copy.sh &

백그라운드 관련 포스터  http://tyson.tistory.com/88



하면 실행될 것이고 끝나면,


$ cat cp_log.txt

를 하면 어디까지 복사 됬는지 볼 수 있다.

Posted by Tyson
2018. 1. 31. 17:50

$> cp [옵션] [원본] [사본]



옵션


-a: 원본 파일의 속성, 링크 정보들을 그대로 유지하면서 복사한다.


-b: 복사할 대상이 이미 있을 경우 기존 파일을 백업하고 복사한다.


-d: 만약 복사할 원본이 심볼릭 링크일 때 심볼릭 자체를 복사한다.


-f: 만약 복사할 대상이 이미 있으면 강제로 지우고 복사한다.


-i: 만약 복사할 대상이 이미 있으면 사용자에게 물어본다.


-l: 하드링크 형식으로 복사한다.


-P: 원본 파일 지정을 경로와 같이했을 경우 그 경로 그대로 복사된다.


-p: 파일의 소유자, 그룹, 권한, 시간 정보들이 그대로 보존되어 복사된다.


-r: 원본이 파일이면 그냥 복사되고 디렉터리라면 디렉터리 전체가 복사된다.


-s: 파일을 심볼릭 링크 형식으로 복사한다. 원본 파일이름을 절대 경로로 지정해야 한다.


-u: 복사할 대상이 있을 때 이 파일의 변경 날짜가 같거나 더 최근의 것이면 복사하지 않는다.


-v: 복사 상태를 보여준다.


-x: 원본과 대상 파일의 파일시스템이 다를 경우에는 복사하지 않는다.


-R: 디렉터리를 복사할 경우 그 안에 포함된 모든 하위경로와 파일들을 모두 복사한다.



$> cp -r /data /data2


이렇게 하면 하위 폴더도 다 복사함.


근데, 소유자, 그룹, 시간등도 똑같이 복사, 또는 백업을 하고 싶으면, 

-a 를 붙이며 된다.


$> cp -ar /data /data2



* -p : 복사되어 새로 생성되는 파일이 원본파일과 동일한 모드, 소유자, 시간정보를 가지도록 하는 옵션이다.

       이 옵션은 바로위의 --preserve 옵션에서 mode,ownership,timestamps 3가지 속성을 동시에 지정한 것과 같다.

       즉, "--preserve=mode,ownership,timestamps" 를 사용한 것과 동일한 결과를 가진다.



근데, 나 같은 경우는 모드나, 소유자는 상관없고, 파일 생성일은 유지하고 싶어서,


--preserve 옵션을 사용했다.


$> cp -r --preserve=timestamps /data /data2



이렇게 하면, 복사 할때 넣는 사용자가 소유자로 들어가고, 생성 시간만 그대로 들어가기때문에,


다른곳에서 사용할때 권한때문에 막히는거 없이 사용가능하다.

Posted by Tyson
2018. 1. 31. 15:36

리눅스에서 이쪽원격에서 다른쪽 원격으로 파일을 백업해 놓고 싶을때, 


xcopy보다 rsync를 쓴다.


rsync 옵션 /원본폴더 /목적지폴더 써주면 된다.


이쪽에서 다른쪽 서버로 보낼때는 밑에처럼 해주면 된다.


목적지를 쓸때는 아이디@아이파: /폴더주소  


이렇게 쓰면 되는데, 


rsync -avz /serverComputer/backup test@192.168.0.2:~/backup


내 추천은 아에 리모트 마운트를 해 놓고 작업하는걸 추천한다.


그러면, 계속 한쪽에서 용량 확인도 할수있으니 좀 더 편하다.


마운트는 


$ sudo mkdir /data

$ sudo mount xxx.xxx.xxx.xxx:/target_path /data



mount 아이피:/목적지경로 /마운트원하는폴더


이렇게 해준다.


정보 확인은 


df -h 하면 된다.


마운트해제를 원하면 umount 하면 된다.


$ sudo umount /data



이렇게 마운트 하고, 이제 복사를 하자.



$ rsync -arvh /original_data /data




rsync 옵션 /원본 /복사할곳


이렇게 적어주면 된다.


옵션 목록은 맨 밑에 추가해 놓았다.


나같은 경우는 -arvh만 했는데,


-a는 아카이브라고하고,


-r은 하위폴더이고,


-v는 로그 보기 편하게 보여주는거고,


-h는 기계어로 나오는 로그를 사람이 보기편하게 해주라는건데, 그냥 툳였다.



그리고 복사하다보면 퍼미션 오류가 뜨는데,


rsync: chown "/data/ff" failed: Operation not permitted 

이라는 에러가 뜰때가 있다.


퍼미션 문제는 


rsync 메뉴얼에는 


이 부분을 해결하기 위해 rsync 메뉴얼을 보면 


-p, --perms                 preserve permissions


라고 나와 있는 것을 확인할 수 있다. 문제는 -p 옵션을 쓰지 않았는데도 퍼미션이 똑같이 유지되어서 문제를 일이키는 것이다. 


문제의 해답 역시 메뉴얼 안에 있다. 


-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)


무심코 쓰는 -a 옵션 안에 -p 옵션이 숨어있다. 

즉, -a 옵션 대신 -rltgoD 옵션을 쓴다면 퍼미션이 동기화되는 것을 막을 수 있다. 


[원본 소스 http://chungsy02.tistory.com/88]]


난 그냥 -a 대신에 -rltgoD를 썼다.



혹시나 다른 작업을 하고 백그라운드에서 계속 작업을 원하면, 



$ rsync -arvh /original_data /data &


명령어 뒤어 &를 붙여 주면 된다.


옵션 

-v | –verbose동기화시 상세정보를 표시함. 해당 옵션은 3개까지 설정가능. 2,3개동시에 설정하면, 더욱 상세한 정보를 표시함
-q | –quiet동기화 정보를 표시하지 않음. cron등에 의한 배치처리등에서 사용함.
-c | –checksum전송전에 128비트 MD4의 체크섬을 사용하여, 송신서버의 모든 파일의 체크섬을 만든다. 그 체크섬은 수신서버에서 확인함. 그리고 송신서버와 같은 체크섬, 같은 사이즈, 같은 이름인 파일은 스킵. 해당 옵션을 사용하면 매우 느려짐.
-a | –archive아카이브 모드로 실행함. [-rlptgoD]옵션을 지정하면 같은 동작을 하나, 해당 옵션 하나로 대부분의 디렉토리, 파일의 정보를 유지하며 동기화가 가능하므로 편리함.
-r | –recursive재귀적으로 디렉토리를 카피함. 해당 옵션을 지정하지 않으면, rsync명령어로는 디렉토리를 동기화 하지 않음.
-b | –backup동기화할 디렉토리에 이미 파일이 존재하는 경우, 동기화할 디렉토리에 백업. 이 경우 디폴트로 [~]이 붙는다.
-u | –update동기화할 디렉토리에 원본소스보다 최신인 파일이 있을경우, 해당 파일은 동기화하지 않음.
–inplace데이터를 업데이트 해야하는경우, rsync가 파일을 전송하는 방법을 변경한다. 디폴트로는 새로운 복사본을 만들어서 전송하는데, 해당 옵션을 설정하면 동기화 대상 파일에 rsync가 직접 업데이트된 데이터를 쓴다.
이 명령어는 몇가지 영향 끼치는 것이 있다.
1) 바이너리 파일에 사용하면 업데이트 되지 않음.
2) 파일 전송중에는 해당파일은 불일치 상태가 됨.
3) 파일 전송중 실패 혹은 중단이 되면, 해당 파일은 불일치 상태로 남겨짐.
4) 해당파일에 쓰기권한이 없으면 업데이트되지 않음. 그리고
5) rsync의 델타-전송 알고리즘의 효능이 떨어짐.
주의! : 다른 곳에서 해당파일에 접근한다면 사용하지말라, 그리고 복사용으로 사용할경우는 충분히 주의를 기울여서 사용하라.
해당옵션은 큰파일의 블록단위 변화나 데이터의 추가, 그리고 시스템 디스크의 용량이 제한된 상황에서는 유용하다. (네트워크 트래픽 제한은 관계없다.)

또한 해당 옵션은 –partial을 적용시킨다. (전송중 실패한경우 파일을 삭제하지 않기위해서), 그러나 –partial-dir 과 –delay-updates와 같이 사용하면 충돌(conflict)이 일어날 것이다.
rsync 2.6.4에서 –inplace는 –compare-dest, –link-dest와 같이 사용하는건 적절하지 않다.

-l | –links동기화할 서버에 심볼릭 링크를 작성함. 해당옵션을 지정하지 않을경우에는 심볼릭 링크 파일은 동기화하지 않음
-p | –perms퍼미션 정보를 유지하면서 동기화를 함.
-o | –owner소유자 정보를 유지하면서 동기화를 함. root권한을 가진 유저만 실행가능.
-g |–group그룹 정보를 유지하면서 동기화를함.
-D | –devices동기화할 디바이스를 재작성함. root권한을 가진 유저만이 실행가능.
-t | –times파일의 타임 스탬프를 유지하면서 파일을 동기화함. 해당옵션을 지정하지 않는경우는, 모든 파일에 대해 비교 작업을 실행함.
-n | –dry-run실제로 동기화를 실행하지는 않고, 동기화 하게될 때의 동작을 표시해줌
-e | –rsh=커맨드rsync커맨드로 사용할 리모트 쉘 프로그램(ssh같은거)를 지정함. 디폴트로는 rsh를 사용
–del|–delete동기화 소스에 없는 파일이 동기화할 곳에 있는 경우, 그 파일을 삭제함.
–partial부분적으로 전송된 파일을 유지시킴
–partial-dir=DIR부분적으로 전송된 파일을 지정한 DIR에 둠.
–delay-updates업데이트할 파일들을 가장마지막에 둠.
-z | –compress동기파일을 압축함.
–exclude=패턴지정한 패턴에 일치하는 파일을 동기대상에서 제외시킴.
–exclude-from=FILE파일에 기술된 패턴과 일치하는 파일을 제외.
–deamonrsync를 데몬 모드로 실행함.
–config=FILE별도의 rsyncd.conf파일을 지정
–statsrsync알고리즘의 송신효율을 표시함.
-h | –human-readable결과의 수치들을 사람이 읽기편한 포맷으로 출력
–progress전송의 진행 상황을 표시
-P–partial –progress 와 동일
-i | –itemize-changes모든 업데이트에 대한 요약을 출력
–log-file=FILE무슨 작업을 했는지에 대한 상세로그를 파일로 남김
동기화 소스 디렉토리동기화 소스 디렉토리를 지정함.
[[유저명@]호스트명:]동기화할디렉토리동기화할 서버와 디렉토리를 지정함. 리모트 호스트를 (동기화)타겟으로 할 경우는, 반드시 호스트와 유저명을 같이 지정해야한다.
–version커맨드의 버전을 표시함.
–help커맨드의 도움말을 표시함.

[원본소스 : http://gyus.me/?p=214]]


Posted by Tyson