shell, nohup (no hang up) 사용하기

2021-06-27
  • linux
  • shell
  • 같이 일하셨던 차장님이 nohup 를 사용하여 개발 서버에서 작업하시는걸 보고 뭔지 잘 모르는거라 정리한다.

    nohup 명령어는 ssh 접속이 끊어져도 실행 중인 프로그램을 죽이지 말라는 명령어이다.

    & 백그라운드 실행 명령어와 보통 함께 쓰인다.

    백그라운드 프로세스란, 사용자와의 입출력이 없는 프로세스를 의미한다.
    데몬 프로세스란, 백그라운드 프로세스 중 부모프로세스가 init (PID 1) 이거나, 다른 데몬 프로세스인 프로세스를 의미한다.
    사용자가 실행 중인 쉘 프로세스가 부모 프로세스인 경우, 사용자가 ssh 접속을 종료하면 이에 따라서 같이 종료되기 때문에 사용자의 접속 종료와 별개로 돌아야하는 프로세스를 데몬 프로세스로 만든다.
    nohup 명령어로 실행한 프로세스는 사용자가 접속중일 때는 사용자의 쉘 프로세스를 부모프로세스로 갖지만,
    사용자가 접속을 종료하면 부모 프로세스가 init 프로세스로 변경된다.

    nohup-test.sh (테스트 대상이 될 쉘 스크립트)

    현재 시간과 index 를 찍고, 1초 쉬는 걸 20번 하는 스크립트

    #! /bin/bash
    
    i=1
    
    while [ $i -lt 21 ]
    do
      echo current date is `date` and index is $i
      i=$(($i+1))
      sleep 1
    done
    

    그냥 실행하게 되면, 사용자는 해당 쉘이 찍는 출력을 보게 된다.

    $ ./nohup-test.sh
    rm: cannot remove 'nohup.out': No such file or directory
    current date is Sat Jun 26 17:53:08 UTC 2021 and index is 1
    current date is Sat Jun 26 17:53:09 UTC 2021 and index is 2
    current date is Sat Jun 26 17:53:10 UTC 2021 and index is 3
    current date is Sat Jun 26 17:53:11 UTC 2021 and index is 4
    current date is Sat Jun 26 17:53:12 UTC 2021 and index is 5
    ...
    

    하지만 nohup 와 함께 실행하면, nohup.out 으로 출력을 돌리고, 아무 출력을 볼 수 없다.

    $ nohup ./nohup-test.sh
    nohup: ignoring input and appending output to 'nohup.out'
    

    마찬가지로 사용자는 아무 입력도 못하게 되는데 이는 쉘스크립트가 포그라운드로 떠있기 때문이다.

    쉘스크립트를 백그라운드로 실행하기 위해서는 단순히 뒤에 & 만 추가해주면 된다.

    $ nohup ./nohup-test.sh &
    [1] 26748
    $ nohup: ignoring input and appending output to 'nohup.out'
    $
    

    기본적으로 실행 프로그램과 같은 디렉토리에 nohup.out 에 표준출력이 쌓이게 되는데, 이를 변경하고 싶으면 단순하게 표준출력만 돌려주면 된다.

    $ nohup ./nohup-test.sh > other.log &
    [2] 27108
    $ ls
    nohup-test.sh  other.log
    

    참고