devnoong.log
article thumbnail
728x90

자주쓰이는 명령어 중 하나인 Nohup 명령어에 대해 알아보도록 하겠습니다~

 

일반적으로 SSH를 통해 프로그램을 실행할 때 연결이 끊기거나 로그아웃하면 세션이 종료되면

터미널은 실행한 프로세스들에게 HUP Signal을 전달 하여  모든 프로세스를  중지 시킵니다

 

중지 시그널 HUP Signal을 무시하고, 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도

지속적으로 동작 할 수 있게 해주는 명령어가 nohup 명령어 입니다.

 

 

no(=Ignore) hup , 즉 HUP Signal을 무시하라는 뜻의 명령어입니다

 

 

nohup 명령 사용법

 

1. 포그라운드 nohup명령어 수행

nohup 명령어는 아래와 같습니다.

프로세스 및 실행 명령어 부분에 실행하고자하는 스크립트나 프로세스를 기입해주면 됩니다

 

이러한 command 명령어는 포그라운드 시점에서 명령어를 수행한다고 표현합니다

출력 결과는 nohup을 실행 시킨 경로에  nohup.out 파일로 리디렉션 됩니다

 

nohup {프로세스 및 실행 명령어}

 

테스트를 위해  예제 스크립트를 아래와 같이 작성해봤습니다
test 문자열을 2초 sleep 주고 무한 반복 실행하는 스크립트입니다

vi test.sh​
while true; do
  echo "test"
  sleep 2
done


참고로 스크립트 파일 권한은 755이상이어야 정상적으로 실행됩니다.

 

nohub 명령어를 실행 했고 실행한 결과가 nohup.out 파일로 리디렉션 되었음을 나타납니다.

 

 

실행 시킨 위치에 nohup.out 파일이 생성되었음과 출력 내용이 쌓이는 것을 확인 할 수 있습니다

 

 

이렇게 포그라운드로 nohup 명령어를 수행 해 봤습니다

 

2. 백그라운드 nohup 명령어 수행

 

nohup을 포그라운드에서 수행 시 명령어가 완료 될때까지 접속한 터미널 및 셸과 상호작용을 할 수 없습니다.

 

불편하다고 느껴지지 않나요?

불편하니까  터미널 및 쉘과 상호작용을 하도록 백그라운드 수행 명령어를 이용해 수행시킵니다

 

명령을 백그라운드에서 실행하려면 명령 끝에 & 기호를 추가하면 됩니다~

 

간단하져?

nohup {프로세스 및 실행 명령어} &

 

 

출력결과는 그대로 nohup.out 파일에 추가되는 것을  확인 할 수 있습니다~

백그라운드로 작동하기때문에 원하는 명령어를 추가 입력 할 수 있습니다

 

3. nohup 프로세스 종료

포그라운드로 실행 했을 경우에는  Ctrl + z 버튼을 이용해  쉘을 종료시키면 실행중인 프로세스가 종료되었지만

백그라운드에서 실행 했을 경우에는  pid를 찾은 후 kill 명령어를 이용해줘야만 nohup 프로세스가 정상적으로 종료됩니다

 

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

 

test.sh 쉘 파일을 수행시켰기때문에 수행 명령어에 test.sh를 입력하였습니다

다른 명령어를 수행 했으면 해당 명령어로 입력해주세요~ :)

 

ps -ef | grep test.sh #수행 명령어

 

 

수행시킨 쉘 프로세스 PID가 9034인것을 확인 할 수 있습니다.

 

이제 해당 프로세스를 kill 명령어를 이용해 종료하도록 하겠습니다

 

kill -9 9034 #프로세스 id

 

프로세스를 조회해보면 정상적으로 프로세스가 종료된것을 확인 할 수 있습니다

 

4. 출력 파일 생략하기

 

nohup 출력 결과인 nohup.out 파일을 생성하고 싶지 않을 경우도 존재합니다.

출력 결과가 많다면 디스크 용량만 차지 할 수도 있기때문입니다.

 

log 파일을 생성하지 않기 위해서는 "/dev/null"  명령어를 사용합니다

 

nohup {프로세스 및 실행 명령어} 1>/dev/null &

 

 

숫자의 의미는 다음과 같습니다.

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

 

 

즉, 위의 명령어는 프로세스 실행  출력 결과를 /dev/null로 전달하여 버려달라는 뜻 입니다

하지만 표준 에러(stderr) 의 경우 아래 명령어 결과에 나와있는 것처럼  그대로 출력 될 것 을 의미합니다

 

 

그럼 실행한 결과 말고 에러 출력 결과도 나오게 하고싶지 않으면 어떻게 해야될까요?

 

똑같이 "/dev/null" 명령어를 추가해줘서 사용하면 됩니다~

 

nohup sh test.sh 1>/dev/null 2>/dev/null &

 

 

근데... 앞에서도 "/dev/null" 명령어를 쓰고.. 뒤에서도 똑같이 또 쓰려니까 너무 귀찮지 않나요 ?-?

 

그리하여 "/dev/null"  명령어 대신 &1 을 사용합니다.

 

2>&1

표준 에러(2)를 표준 출력(1) 이 전달되는 곳 (/dev/null) 로 동일하게 전달시켜주라는 뜻 입니다.

 

 

nohup sh test.sh 1>/dev/null 2>&1 &

 

 

위의 명령어가 간편하기때문에 보통 아래의 형식으로 많이 사용하고 있습니다~

 

nohup {프로세스 및 실행 명령어} 1>/dev/null 2>&1 &

 

5. 출력 파일 변경하기

출력 파일을 생략하는 것이 아니라 내가 원하는 위치와 파일명으로도 변경 할 수 있습니다.

 

방식은 생략하는거와 거의 유사합니다.

다른 점이 존재한다면 생략할 경우에는 /dev/null 을 이용했지만, 변경할때에는 변경 위치 및 파일명으로 대체된다는 점 입니다.

 

nohup {프로세스 및 실행 명령어} 1> {출력 파일 위치 및 파일명}  2>&1 &

 

출력 파일물을 현재위치의 test_output.log로 생성되도록 변경 후 조회해보니 아래와 같이 파일이 생성된 것을 확인 할 수 있습니다~

 

 

그럼 끝~~~~

728x90