- 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

+ Recent posts