nohup 사용법과 nohup.out 파일 명 변경, 로그 없이, 날짜 별로 rotation 하는 방법 ( Linux )
🌜 Server/AWS & Linux

nohup 사용법과 nohup.out 파일 명 변경, 로그 없이, 날짜 별로 rotation 하는 방법 ( Linux )

728x90

안녕하세요. 그린주입니다 ๑'ٮ'๑

오늘도 힘차게 시작해보겠습니다!

 

개요

이번 글에서는 nohup 사용법과 nohup.out 로그 관련 설정, 프로세스를 종료하는 방법을 공유하고자 합니다.


목차

nohup 설명

nohup.out 관리

nohup.out 날짜 별로 rotation 하는 방법

nohup 프로세스 종료


nohup 설명

1. nohup이란 무엇인가?

"no hangups"라는 의미리눅스, 유닉스에서 명령어나 쉘 스크립트 파일(*. sh)을 데몬 형태로 실행시키는 프로그램입니다.

 

2. nohup을 사용하는 이유?

nohup은 터미널이나 세션이 종료되어도 해당 프로세스가 종료되지 않고 동작하여 진행한 작업이 완료될 때까지 수행할 수 있도록 도와줍니다. 가끔 오랜 시간이 걸리는 스크립트나 명령어를 사용할 때 사용하면 좋습니다.

 

사용방법은 아주 간단합니다. 프로그램 실행 명령어 앞에 "nohup"만 붙여주면 됩니다. 실행하면 실행한 경로에 "nohup.out"이라는 log파일이 생성됩니다. 이 파일에는 리다이렉션을 사용하지 않은 출력 문자열이 자동으로 저장됩니다.

 

3. 주의사항

nohup으로 스크립트 파일(*. sh)을 실행한다면 실행할 스크립트 파일은 퍼미션이 755 이상 상태여야 합니다.

chmod 755 [스크립트 파일]

nohup.out 관리

1. nohup 실행 시 log 파일 생성

log파일은 nohup 명령을 실행한 위치에 "nohup.out"파일로 생성됩니다.

  만약 nohup 명령어로 직접 만든 스크립트 파일(*. sh)을 실행하고자 하는데 명령어 실행 시 "exit"가 나온다면 스크립트 파일에 에러가 있다는 것입니다.

 

저는 jar 파일을 백그라운드로 실행해보겠습니다.

$ nohup [실행파일] &
// 예시
$ nohup java -jar /home/ec2-user/test.jar &

  [실행파일]

 

실행하고자 하는 프로세스

스크립트일 경우 파일의 권한이 755 이상이어야 합니다.

 

 

  &

 

프로세스를 실행할 때 백그라운드에서 동작하도록 만드는 명령어입니다.

 

 

아래와 같이 생성됩니다.


2. nohup 실행 시 log 파일 생성하지 않기

log 파일을 생성하지 않기 위해 백그라운드 실행과 출력을 "/dev/null"로 보내는 명령어를 사용합니다.

$ nohup [실행파일] 1>/dev/null 2>&1 &
// 예시
$ nohup java -jar /home/ec2-user/test.jar 1>/dev/null 2>&1 &

  숫자의 의미

 

0 : 표준 입력, 1 : 표준 출력, 2 : 표준 에러

 

 

  1 > /dev/null

 

표준 출력(1)의 결과를 /dev/null(버림)로 전달

 

 

  2>&1

 

표준 에러(2)를 표준 출력(1)이 전달되는 곳(/dev/null)으로 동일하게 전달


3. nohup.out 경로 또는 파일명 변경

">" 또는 ">>"와 같은 리다이렉션을 이용해 다른 파일에 출력할 수 있습니다. 

  경로 변경 시에는 폴더 생성 후 실행해야 합니다.

/log/nohup_log.out: No such file or directory 에러가 발생할 수 있습니다.

 

3 - 1. write 덮어쓰기

// ">" - write - 덮어쓰기
$ nohup [실행파일] > [파일] 2>&1 &

// 예시
$ nohup java -jar /home/ec2-user/test.jar > /home/ec2-user/log/nohup_log.out 2>&1 &

 

1번째 실행

원하는 경로, 파일명으로 생성되었습니다.

2번째 실행

아래와 같이 새로 출력되고 있습니다.


3 - 2. append 이어 쓰기

// ">>" - append - 이어쓰기
$ nohup [실행파일] >> [파일] 2>&1 &

// 예시
$ nohup java -jar /home/ec2-user/test.jar >> /home/ec2-user/log/nohup_log.out 2>&1 &

1번째 실행

원하는 경로, 파일명으로 생성되었습니다.

2번째 실행

아래와 같이 이어서 출력되고 있습니다.


4. 표준 출력과 표준 에러 따로 관리하기

표준 출력과 표준 에러를 따로 관리하고 싶을 때는 아래와 같은 형식을 사용할 수 있습니다.

$ nohup [실행파일] 1>[파일1] 2>[파일2] &
// 예시
$ nohup java -jar /home/ec2-user/test.jar 1>output.log 2>error.log &

  1 > output.log

 

표준 출력을 "output.log"라는 파일에 전달

 

 

  2 > error.log

 

표준 에러를 "error.log"라는 파일에 전달

728x90

nohup.out 날짜 별로 rotation 하는 방법

1. nohup 실행하기

nohup를 실행하여 nohup.out을 생성해줍니다.

$ nohup [실행파일] &
// 예시
$ nohup java -jar /home/ec2-user/test.jar &

2. nohup.sh 만들기

설정 파일은 nohup.out 안에 내용이 있을 때만 rotation 하는 방법으로 진행했습니다.

  내용 유무와 상관없이 만들고 싶다면 if 구문만 지우시면 됩니다.

#!/bin/bash

file=/home/ec2-user/nohup.out 				// log 파일
date=`date +%y%m%d-%H%M%S` 				// 저장할 날짜
filePath=/home/ec2-user/nohupHistory/nohup.$date.out 	// 저장할 경로

// # 파일 용량이 0보다 클 때 rotation
if [ -s $file ] ; then
	cp "$file" "$filePath"				// 1. nohup.out 복사
	echo "백업완료 cp $file $filePath"		// 2. print
	cat /dev/null > "$file"				// 3. nohup.out 비우기
else 
	echo "백업없음 $file"
fi
echo "*******************************************************"

  if [ 조건 ] ; then [true일 경우 내용] else [전체 false일 경우 내용] fi

 

shell script의 if ... else 조건문입니다.

사용 시 주의할 점"[ 조건 ]" 작성 시 대괄호 양 사이에 한 칸씩 꼭 공백이 있어야 합니다.

만약 붙여서 쓰게 되면 에러가 발생합니다. 

 

 

  -s $file

 

"-s"는 "$file"지정한 파일이 존재하고 0 size 파일이 아닌지 체크하는 옵션입니다.

파일이 있고 사이즈가 0보다 클 경우 true입니다.


3. crontab 등록하기

위에서 생성한 nohup.sh을 특정 시간에 또는 특정 시간마다 실행시켜주는 설정입니다.

crontab 편집기에 cron표현식을 등록합니다.

// crontab 등록/수정
$ crontab -e

// crontab -e 편집
59 23 * * * sudo sh /home/ec2-user/nohup.sh

  59 23 * * * sudo sh /home/ec2-user/nohup.sh

 

매일 23시 59분에 nohup.sh를 root 권한으로 실행

 

 

아래 명령어로 등록된 작업을 확인할 수 있습니다.

$ crontab -l


4. TEST

아래와 같이 1분마다 실행되도록 설정해 두었습니다.

 

...4분 뒤..

rotation이 너무너무 잘되는 것을 확인할 수 있습니다.

 

date로 현재 시간을 찍었을 땐 제대로 한국시간이 나왔지만,

contab에선 시간이 제대로 실행되지 않을 경우 타임존을 변경해야 합니다. 방법은 간단합니다.

 

cron을 재시작해줍니다.

$ sudo systemctl restart crond.service
// 또는
$ sudo service crond restart

nohup 프로세스 종료

프로세스를 종료하려면 pid 찾아서 종료해주어야 합니다.

  nohup.out 파일을 삭제한다고 해서 nohup 프로세스가 종료되지 않습니다.

 

1. PID 찾기

$ ps -ef | grep [실행파일]
// 예시
$ ps -ef | grep jar

제가 실행시킨 test.jar의 PID는 9564입니다.


2. 해당 프로세스 종료 하기

$ sudo kill -9 [PID번호]
// 예시
$ sudo kill -9 9564

명령어 실행 후 다시 1번 명령어를 확인해보면 프로세스 없어진 것을 확인할 수 있습니다.


마무리

이렇게 nohup 사용법과 nohup.out 로그 관련 설정, 프로세스를 종료하는 방법에 대해 적어보았습니다.
다들 성공하셨을까요?? 끝까지 파이팅입니다!

 

긴 글 봐주셔서 감사합니다!
오늘도 행복한 하루 보내세요 '◡'✿


참고

https://jasontody.tistory.com/113

https://brownbears.tistory.com/164     

http://itnovice1.blogspot.com/2019/01/linux-nohup.html    

https://knight76.tistory.com/3087

https://devpouch.tistory.com/128


728x90
728x90