만쥬의 개발일기

nohup이란?

"no hangups"라는 의미 리눅스, 유닉스에서 명령어나 쉘 스크립트 파일(*. sh)을 데몬 형태로 실행시키는 프로그램이다. 데몬 형태로 실행시킨다는 것은,  UI 없이 시스템 백그라운드에서 동작하는 프로그램을 지칭한다.

 

nohup을 사용하는 이유

nohup은 터미널이나 세션이 종료된 후에도 해당 프로세스가 종료되지 않고 지속적으로 동작하게 해준다.

즉 리소스를 끊지 않는 이상, (로컬의 컴퓨터를 종료하거나 인스턴스를 종료하거나 프로세스를 죽이거나 등등)

계속해서 프로세스는 동작하게 된다.

오랜 시간이 걸리는 스크립트나, 항상 켜두어야 하는 서버 등을 배포할 때 주로 사용한다.

 

사용방법은 프로그램 실행어 앞에 nohup을 붙여주면 되고, 실행 시 실행한 경로에 "nohup.out"이라는 log 파일이 생성된다. 이 파일에는 출력 문자열들이 자동으로 저장된다.

 

nohup 실행 및 log 파일 생성

만약 jar 파일을 nohup을 이용해 백그라운드에서 실행하고 싶다면 쉘에 다음과 같이 입력하면 된다.

nohup java -jar /home/ec2-user/test.jar &

여기서 &은 백그라운드에서 실행시키라는 의미이다.

 

log 파일 경로 변경

 

만약 log 파일을 다른 원하는 파일로 경로를 바꾸고 싶다면 다음과 같이 입력한다.

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

 

 

숫자의 의미

 

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

 

 

  > ~/log/nohup_log.out

 

표준 출력(1)의 결과를 ~/log/nohup_log.out 로 전달

 

 

  2>&1

 

표준 에러(2)를 표준 출력(1)이 전달되는 곳( ~/log/nohup_log.out )으로 동일하게 전달

 

기존 log 파일 이어쓰기

// ">>" - append - 이어쓰기
$ nohup [실행파일] >> [파일] 2>&1 &
nohup java -jar /home/ec2-user/test.jar >> ~/log/nohup_log.out 2>&1 &

 

표준 출력과 표준 에러를 따로 관리

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"라는 파일에 전달

 

원하는 날짜마다 nohup.out 새롭게 생성하기

nohup.sh 스크립트 만들기

~/log 경로에 스크립트를 만들어준다.

#!/bin/bash

file=~/log/log.out //로그 파일
date=`date+%y%m%d-%H$M$S` //저장 날짜
filePath= ~/log/logHistory/log.$date.out // 저장 경로

cp "$file" "$filePath" //log.out 복사
echo "백업완료 cp $file $filePath" //print
cat /dev/null > "$file" //내용 지우기

fi
echo "***************************"

 

crontab 등록하기

위에서 생성한 스크립트를 특정 시간마다 실행시켜주는 설정을 crontab으로 해준다.

 

아래 명령어로 crontab 편집기를 켜주고

crontab -e

 

아래 내용을 입력해준다.

59 23 * * * sudo sh ~/log/nohup.sh

매일 23시 59분에 nohup.sh를 root 권한으로 실행 시킨다는 의미이다.

 

crontab -l

위 명령으로 등록된 작업들을 확인 가능하다.

 

백그라운드로 실행한 프로세스 종료하기

ps -ef | grep jar

위 명령어로 내가 실행한 jar 파일을 찾는다.

sudo kill -9 {processID}

이후 프로세스 아이디를 넣어 종료시켜준다.

 

 

reference

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!