데이터 마이그레이션 할 때 rsync 명령어를 주로 사용하는데, 이때 rsync란 어떤 개념인 지 자세히 알아보자.

 

- rsync란?

  • rsync는 Remote Synchronization의 줄임말로 파일과 디렉토리를 동기화하기 위한 프로토콜이자 리눅스의 유틸리티 명령어다.
  • rsync 명령어를 이용해 로컬에 있는 파일이나 디렉토리를 원격 호스트로 보내거나 원격에 있는 파일, 디렉토리를 로컬로 복사해 올 수 있다.

- 장점

  • 원격 시스템으로부터 파일을 효율적으로 복사 및 동기화할 수 있다.
  • link, device, 파일의 소유자와 그룹권한 등 파일의 부가정보까지 복사가 가능하다.
  • 빠르다.
  • rsync는 remote-update 프로토콜을 이용해서 차이가 있는 파일만 복사한다.
  • 처음에는 모든파일 및 디렉토리를 복사 후, 이후부터는 출발지와 목적지 간의 다른부분 만을 복사하기 때문에 빠르고 효율적으로 작동한다.
  • 데이터를 압축해서 송수신하기 때문에 적은 대역폭을 사용한다.
  • 파일크기 또는 시간의 변화 등을 이용하여 동기화한다.

 

- 설치

  • 대부분의 리눅스 배포판이나 OSX에는 기본 설치가 되어 있다.
  • 하지만 일부 리눅스를 최소 설치 옵션으로 설치했다면 rsync가 포함되지 않았을 수 있다. 이 경우 아래처럼 yum이나 apt 등으로 설치해주면 된다.
$ sudo yum install rsync 
또는
$ sudo apt-get install rsync


- 사용법

$ rsync [OPTIONS] [SOURCE] [TARGET]

- 예시

# 로컬 데이터를 로컬에 복사
$ rsync -avh /home/user/data /home/new_user/backup

# 로컬의 데이터를 리모트로 복사 
$ rsync -avh /home/user/data remote_user@remotehost:/home/remote_user/backup

# ssh 포트가 다른 경우
$ rsync -avh -e "ssh -p 123" /home/user/data remote_user@remotehost:/home/remote_user/backup

# 리모트 데이터를 로컬로 가져옴
$ rsync -avh remote_user@remotehost:/home/remote_user/backup /home/user/data
  • SOURCE와 TARGET 순으로 파일의 경로를 입력하면 된다.
  • 만약 SOURCE 혹은 TARGET이 리모트에 있는 파일 경로라면, "[USER]@[HOST]:[PATH]" 형식으로 입력해주면된다.
    이때, 콜론(:)은 빼먹지 않도록 유의해야한다.

 

- 옵션값

man 페이지에서 조회한 rsync 옵션값은 아주 많은데, 그중에서도 자주 사용하는 옵션값은 아래와 같다.

 

옵션 이름설명
-v진행 상황을 상세하게 보여줌
-r지정한 디렉토리의 하위 디렉토리까지 재귀적으로 실행
-l소프트 링크 보존
-H하드 링크 보존
-p버전 속성 보존
-o소유 속성 보존(루트)
-g그룹 속성 보존
-t 타임스탬프 보존
-D디바이스 파일 보존(루트)
-z데이터 압축 전송
-b낡은 파일은 ~가 붙음
-u추가된 파일만 전송, 새 파일은 갱신하지 않음
--existing추가된 파일은 전송하지 않고 갱신된 파일만 전송
--delete서버에 없는 파일은 클라이언트에서도 삭제
-a아카이브 모드. rlptgoD를 자동 지정
-c서버와 클라이언트의 파일 크기를 세밀히 체크
--stats결과를 보고
-e ssh(rsh) 전송 암호화

 
 
 
 
 


Reference
https://hbase.tistory.com/318

https://cheershennah.tistory.com/m/131

 

'Programming > Linux' 카테고리의 다른 글

[Linux] /tmp와 /var/tmp의 차이  (2) 2023.03.11
[Linux] Nohup이란?  (0) 2023.03.10
[Linux] Crontab 이란?  (0) 2022.06.30
[Linux] at이란?  (0) 2022.06.30

프로젝트를 진행하면서 선언하는 변수명, 함수명, 클래스명 등 여러가지 이름들의 명명법에는 그들만의 규칙이 있는데, 대표적으로 카멜표기법, 파스칼표기법, 스네이크 표기법이 있다.


- 카멜(Camel) 표기법

ex) 'helloJiinWorld'	- 첫 문자 hello, 그 이후 문자 Jiin, World
  • 카멜표기법은 말그대로 낙타등처럼 내려갔다 올라가는 모양을 말한다.
  • 예를들어 단어 여러개가 붙을때 맨 앞에오는 단어는 소문자, 그 뒤 단어는 대문자로 표기한다.

- 파스칼(pascal) 표기법

ex) 'HelloJiinWorld'	- 모든 문자 대문자로 시작 Hello, Jiin, World
  • 파스칼 표기법은 단어의 수와 상괸 없이 모든 단어의 앞자가 대문자로 시작한다.
  • 함수명이나 클래스명을 파스칼표기법으로 작성하는 경우가 많은데, 보통 카멜과 파스칼표기법을 섞어 적절히 사용하기도한다.
  • 네임스페이스, 이벤트, 프로퍼티, 클레스 네임을 지정할 때 주로 사용한다.

- 스네이크(snake) 표기법

ex) 'hello_jiin_world'	- 모든 문자 소문자로 시작 hello, jiin, world
  • 언더바(_) 를 붙여 단어를 구분지으며, 단어 사이의 ‘_’가 뱀처럼 보인다고 해서 유래한 표기법이다.
  • 모든 단어가 소문자로 표시된다.

 

 

 

 

 


Reference

 

- /tmp란?

  • 재부팅하면 안에 있는 파일들이 삭제 된다. 재부팅을 하지 않아도 정기적으로 10일마다 삭제

- /var/tmp란?

  • 재부팅을 해도 파일들이 삭제되지 않는다. 정기적으로 30일마다 삭제

 

[root@localhost ~]# cat /usr/lib/tmpfiles.d/tmp.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
 
# See tmpfiles.d(5) for details
 
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
 
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
  • CentOS6까지는 /etc/cron.daily/tmpwatch 라는 스크립트가 위 디렉터리에 있는 파일들을 삭제하는데, CentOS7부터는 tmpwatch를 대신해 systemd-tmpfiles가 동작한다.
  • systemd-tmpfiles의 설정 파일은 /usr/lib/tmpfiles.d/tmp.conf에 위치한다. 
  • 참고로 systemd-tmpfiles-clean.service 서비스에 의해서 파일이 삭제된다.

 

* 더 자세히 알고 싶으면 메뉴얼 페이지를 보자

[root@abc/tmp]#  man tmpwatch   

[root@abc/tmp]# vi /etc/cron.daily/tmpwatch

#! /bin/sh
flags=-umc

/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \
-X '/tmp/pymp-*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done
  • 위와 같이 매일 한 번씩, atime/mtime/ctime 기준으로 10일 이상된 파일을 삭제하는 것으로 보이며, /var/tmp 의 경우는 보관기간이 30일로 더 긴 것으로 나온다.

 

 

 

 

 

 


Reference
https://sysops.tistory.com/208

https://infrajp.tistory.com/18

'Programming > Linux' 카테고리의 다른 글

[Linux] rsync란?  (0) 2023.04.28
[Linux] Nohup이란?  (0) 2023.03.10
[Linux] Crontab 이란?  (0) 2022.06.30
[Linux] at이란?  (0) 2022.06.30

- Nohub이란?

  • nohup은 no hang up의 약자로 백그라운드로 지속적으로 실행하는 프로세스를 의미한다.
  • nohup은 실행을 현재 사용자 세션이 아닌 운영체제가 제공하는 백그라운드 공간에서 실행을 한다.
  • 리눅스는 기본적으로 exit로 세션을 종료할 경우 터미널과 연결이 끊어졌다는 HUP(Hang Up,끊다) 시그널이 발생하고,  자식 프로세스들은 STOP 시그널을 받게 된다.
  • 이 때, nohup 명령은 “세션이 종료되더라도 계속 실행하게 하고 싶은 프로세스에는 HUP 시그널을 전달하지 않도록(No Hang Up,끊지마) 한다"는 의미이다.

 

- 사용법

- 기본 실행

% nohup [실행파일명]

- 예시

chmod 755 test.sh
  • test라는 이름을 가진 스크립트 파일을 nohup 명령으로 실행시켜보자.
  • nohup 으로 실행시킬 파일은 반드시 755 퍼미션을 가지고 있어야 한다.
% nohup ./test.sh
appending output to nohup.out
  • nohup 명령으로 스크립트를 실행해 보면, 위와 같은 메세지 표시가 된다.
  • 이렇게 실행 시키면, 프로세스는 대기 상태가 되고 Ctrl+C를 누르면 종료 된다.
    그리고, 해당 스크립트 프로그램의 표준 출력이 nohup을 실행 시킨 경로에 nohup.out 파일에 출력된다.

- nohup 명령의 표준 출력을 다른 파일에 쓰기

nohup ./test.sh > nohup_test.out
  • 표준 출력을 다른 파일에 쓰기 위에서는 리다이렉션(>, >>)을 사용하면 된다.
nohup ./test.sh > /dev/null
  • 아예 표준 출력을 쓰고 싶지 않다면 위와 같이 하면 된다.

 

- 백그라운드 실행

  • &를 사용하면 프로그램이 백그라운드로 실행된다.
% ./test.sh &
  • 여기서 Ctrl+C를 누르지 않아도 대기 상태가 되지 않는다.
% ps -ef | grep test.sh
  • 위 명령으로 백그라운드로 실행되고 있는 것을 확인 할 수 있다.

* nohup과 &의 차이는?

  • nohup는 프로그램을 데몬으로 형태로 실행시키는 것이기에 앞에서 설명했듯이 로그아웃 등과 같이 세션 연결이 끊기더라도 프로세스가 계속 동작된다. 그러나, 실행 시키면 대기 상태가 발생하고 Ctrl+C를 누르면 프로세스는 바로 종료된다.
  • 그에 비해, 백그라운드(&) 실행은 실행 시키면 대기 상태가 없지만, 세션 연결이 끊기면 실행한 프로그램도 함께 종료된다.
% nohup nohup ./test.sh > /dev/null &

위와 같이 nohup 명령을 백그라운드(&)로 같이 실행시키게 되면, 대기 상태도 없고 세션 연결이 끊기더라도 프로세스의 종료 없이 백그라운드로 실행되게 된다.

 

명령 Ctrl+C 터미널 종료
[command] 명령이 중단됨 명령이 중단됨
[command] & 명령이 중단되지 않음 명령이 중단됨
nohup [command] 명령이 중단됨 명령이 중단되지 않음
nohup [command] & 명령이 중단되지 않음 명령이 중단되지 않음

 

 

- 프로세스 종료

% ps -ef | grep test.sh
  501 61324 21348   0  7:34AM ttys001    0:00.01 /bin/bash ./test.sh
  501 61329 21348   0  7:34AM ttys001    0:00.00 grep test.sh

 

% kill 61324
  • 프로세스 종료는 먼저 다음 명령으로 프로세스 아이디를 조회 후, 종료시킬 프로세스 아이디를 kill 명령으로 종료시키면 된다. 

 

최신 리눅스는 nohup을 복제하는 systemd-run 사용을 권장하고 있다고 한다.

 

 

 

 

 

 

 


Reference

https://www.devkuma.com/docs/linux/nohup/

'Programming > Linux' 카테고리의 다른 글

[Linux] rsync란?  (0) 2023.04.28
[Linux] /tmp와 /var/tmp의 차이  (2) 2023.03.11
[Linux] Crontab 이란?  (0) 2022.06.30
[Linux] at이란?  (0) 2022.06.30

이번에 PHP로 프로젝트 하면서 서버로 이미지를 수정해야 하는 상황이 왔는데, 여러 방법으로 이미지를 수정해보았다.

 

먼저, PDF 파일을 JPG로 변환하기 위해 imagick 라이브러리를 사용했다. 

imagick는 이미지 처리에 필요한 모듈인데, 따로 설치가 필요하다.

 

[imagick 확장 모듈 설치]

1. 패키지 설치

yum install ImageMagick ImageMagic-devel

 

2. imagick 다운로드

- 최신버전 다운로드 사이트 : http://pecl.php.net/package-stats.php 

wget http://pecl.php.net/get/imagick-3.1.2.tgz

3. 압축 풀기

tar zxvf imagick-3.1.2.tar.gz

 

4. 설치

cd imagick-3.1.2

/usr/local/php54/bin/phpize

./configure --with-php-config=/usr/local/php54/bin/php-config

make && make install  

(phpize 및 php-config는 php 설치 경로에 맞게 하면 된다.)

 

5. php.ini 수정

vim php.ini

;; imagick

extension = imagick.so

(해당 extension_dir 경로 확인 후 그쪽에 imagick.so 카피 후 extension 설정하면 된다.)

 

[PDF -> JPG 변환]

imagick 설치가 완료되면, 아래 소스를 이용하여 PDF 파일을 JPG로 변환해준다. 

$images = new Imagick("/img/test.pdf");
foreach($images as $i=>$image) {
  $image->setResolution(300,300);
  $image->writeImage("/img/test".$i.".jpg");
}

1. 변환할 PDF 페이지 지정

$pdf->getNumberOfPages(); //returns an int
$pdf->setPage(2)
    ->saveImage($pathToWhereImageShouldBeStored); //saves the second page

2. 저장될 이미지의 포맷 설정

$pdf->setOutputFormat('png')
    ->saveImage($pathToWhereImageShouldBeStored); //the output wil be a png, no matter what

3. 저장될 이미지의 해상도 설정

$pdf->setCompressionQuality(100); // sets the compression quality to maximum

해상도는 최대 100까지 설정할 수 있으며, 해상도가 높을수록 이미지 변환 속도는 느려진다. 

 

4. 저장될 이미지의 크기 설정

$pdf
   ->width(400)
   ->saveImage($pathToWhereImageShouldBeStored);

5. 이미지 배경 하얗게 설정

$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); # 혹은 $im->setImageAlphaChannel(11);
$im = $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

PDF->JPG로 변환했을 시, 변환된 이미지 배경이 까맣게 나오는 경우가 있었는데, 위 소스를 추가하여 해결하였다. 

 

 

[JPG -> base64 변환]

이번에는 이미지 위에 텍스트를 넣기 위해, 이미지 파일을 base64로 인코딩한 텍스트 문자로 img 태그에 적용하였다. 

<img src="data:image/gif;base64, ...>
<?php  
 $data = base64_encode(file_get_contents("test.jpg")); 
 echo "<img src='data:image/gif;base64, $data'>"; 
 ?>

base64로 인코딩은 위 소스를 이용하여 변환하였다.

 

이렇게 img 태그에 base64로 인코딩한 텍스트를 넣어주고, 그 아래 td 태그를 이용하여 텍스트를 입력하면 원하는 이미지 위에 텍스트를 뿌려줄 수 있다.

 

 

[PDF 병합]

$ gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

 

[JPG 병합]

$ convert +append image1.png image2.png out.png # 가로로 붙이기
$ convert -append image1.png image2.png out.png # 세로로 붙이기
$ convert +append -geometry 240x a.png b.png output.png # 크기 변환

 

PHP에서 exec를 통해 위 소스를 실행시켜 병합해주면 된다.

 

* PHP exec 란?

exec 함수는 외부 프로그램을 실행시켜주는 함수로 리눅스에 php 가 설치된 경우 쉘 명령어들을 사용할 수 있다.
 
 
 

 

 
 

 

'Programming > php' 카테고리의 다른 글

[php] ZipArchive 사용한 다중 파일 압축하기  (0) 2023.05.24
 

Uncaught SyntaxError: missing ) after argument list

 

자바스크립트에서 발생한 오류로 onclick에서 String 파라미터를 넘겨야하는데 못넘겨서 발생한 오류이다.

주로 아래와 같은 케이스에서 발생한다. 

 

 

- Case 01 : 문자열을 연결하는 "+" 연산자가 없는 경우

console.log('PI: ' Math.PI);
// SyntaxError: missing ) after argument list
console.log('PI: ' + Math.PI);
// "PI: 3.141592653589793"

- 해결 방법01

+ 연산자 를 추가한다.

 

- Case 02 :  따옴표로 감싸주지 않은 경우

content += '<a herf="javascript:void(0);" onclick="adresMove('+ value.indv_lnm_adres + ',' + key + ');">';
// Uncaught SyntaxError: missing ) after argument list

- 해결 방법02

content += '<a herf="javascript:void(0);" onclick="adresMove(\''+ value.indv_lnm_adres + '\',\'' + key + '\');">';

따움표를 시작하는 부분과 끝나는 부분에서 \, 즉 역슬래시를 붙여주면 따움표로 인식하여 정상적으로 작동이 된다.

즉,  시작부분은 \'   끝나는 부분은 \'    똑같은 방법으로 처리해준다. 

 

- Case 03 :  JSON 데이터의 오류가 있는 경우

데이터를 JS의 JSON.parse(); 에서 호출하는데, 스트링 안에 ' 가 포함되어 있으면 오류가 난다.

 

예 ) "AB'C"

위와 같은 경우,  function( 'AB&apos;C); 와 같이 되어야 하는데,  function( 'AB'C); 로 인식되어

스크립트에서는 마지막에 ')' 괄호를 문자로 인식한다.

- 해결 방법03

이럴 때는 컨트롤러 단에서 특수 문자 치환이 필요하다.

for(int i=0; i<list.size(); i++) {
  String tmp = (String) list.get(i).get("text");
  list.get(i).put("text", tmp.replace("'", "&apos;"));
}

결국 '를 &apos; 로 치환하여 HTML에서 문자열로 인식하게 변경해줘야 한다.

아래는 HTML에서 특수 문자로 인식할 수 있어 치환이 필요한 대표적인 문자들이다.

 

^   &Hat;
'    &apos;
>   &gt;
<   &lt;
;    &semi;
&  &amp;
"   &quot;
#   &num;

 

혹은 Controller단에서 ''를 붙이지 않고 넣어주도록 수정해도 된다. 

 

 

 

 

 

 


Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Errors/Missing_parenthesis_after_argument_list
https://lookingfor.tistory.com/entry/Uncaught-SyntaxError-missing-after-argument-list

https://chobopark.tistory.com/199

 

- BroadcastChannel이란?

  • Broadcast Channel API는 브라우징 컨텍스트 간의 통신을 보다 쉽게 ​​해주는 간단한 API이다.
  • 즉, 창/탭, iframe, 웹 작업자 및 서비스 작업자 간의 통신이며, 지정된 채널에 게시된 메시지는 해당 채널의 모든 청취자에게 전달된다. 
  • BroadcastChannel생성자는 채널 이름이라는 단일 매개변수를 사용한다 . 이름은 채널을 식별하고 브라우징 컨텍스트 전반에 존재한다.

 

- 사용방법

  • 채널을 오픈한 다음 메세지를 보내면, 해당 채널을 구독하는 컨텍스트에서 메세지를 받아볼 수 있다.
  • 아래처럼 채널을 생성할 수 있다. 만약 처음이면 생성되고, 이미 생성된 채널이면 구독하게 된다.
// my_bus 라는 채널에 연결한다.
const channel = new BroadcastChannel('my_bus');
  • 메세지를 보낼 때는 postMessage라는 메서드를 사용한다. 메세지의 형식은 정해져 있지 않고 structed clone algorithm을 사용해서 시리얼라이즈되므로 웬만한 데이터 타입은 다 쓸 수 있다.
  • 메세지가 포스팅되면 브로드캐스트 채널로 메세지 이벤트가 실행된다. 메세지 이벤트가 발생했을 때 실행할 콜백은 아래처럼 달아두면 된다.
// my_bus에 메시지를 보낸다.
channel.postMessage('This is a test message.'); 

// my_bus에서 메시지를 수신한다.
channel.onmessage = function(e) {
    console.log('Received', e.data);
};

// 완료되면 채널을 닫는다.
channel.close();

 

 

- 주의점

  • 단, 자신이 포스팅한 메세지는 자신이 받아볼 수 없다. 즉 포스팅을 한 페이지한테는 message이벤트가 실행되지 않는다.
  • 창 중 하나가 시크릿 모드이거나 여러 브라우저에서 (예: Firefox에서 Chrome으로)브로드캐스트 채널이 작동하지 않는다.
  • Broadcast Channel API는 아래처럼 호스트가 다르면 작동하지 않는다.
    https://www.abc.com/
    https://abc.com/

 

- 다른 기능과의 차이점

  • Channel Messaging API와 차이점은 기본적으로 broadcastchannel은 one-to-many를 위한 것이고 messagechannel는 one-to-one을 위한 것이라는 점이다.
  • window.postMessage 와의 차이점은, broadcastchannel은 same origin만 지원하지만 window.postMessage는 그렇지 않다는 점이다. 그리고 window.postMessage는 타켓 윈도우의 참조도 알고 있어야 하는 반면 broadcastchannel은 채널 이름으로 구독하고 양방향 소통이 가능해서 사용이 훨씬 쉽다.

 

 

 

 

 

 


Reference

https://developer-alle.tistory.com/m/433
https://developer.chrome.com/blog/broadcastchannel/

https://hjcode.tistory.com/100

'Programming > JavaScript' 카테고리의 다른 글

[자바스트립트] 정규 표현식이란?  (0) 2023.06.13

net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

 

크롬 웹브라우저에서 파일을 다운받다 생긴 오류이다. 

다른 브라우저는 중복헤더를 무시하기 때문에 해당 에러가 IE나 사파리에서는 발생하지 않지만,  크롬에서는 해당 이슈가 존재한다고 한다.

 

- 해결 방법

1. 첨부파일 다운로드 시 파일명을 큰따옴표(“)로 감싼다.
2. 첨부 파일명에 콤마(,)가 존재하면 다른 문자로 변경한다.

 

 

나같은 경우에는,  replace 함수를 통해 문자열을 치환하여 오류를 해결하였다. 

 

 

 

 

 

 


 

Reference

https://bebeya.tistory.com/entry/ERRRESPONSEHEADERSMULTIPLECONTENTDISPOSITION-ASP-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EC%98%A4%EB%A5%98https://ansan-survivor.tistory.com/432

+ Recent posts