리눅스 시스템에서 작업을 수행하다 보면, 긴 시간이 걸리는 명령어를 실행해야 할 때가 있다. 그러나 터미널을 닫거나 세션이 끊기면 작업이 종료되는 문제가 생길 수 있다. 이를 방지하기 위해 리눅스는 여러가지 백그라운드 실행 방법을 제공하고 있다. 오늘은 그 중에서도 가장 대표적인 &
와 nohup
의 차이점과 사용 방법에 대해 알아보자.
&
&
는 명령어를 백그라운드에서 실행하도록 설정하는 가장 간단한 방법이다.
다음과 같이 실행하려는 명령어 뒤에 &
를 붙이면 된다.
$ [command] &
&
는 명령어 실행 후, 바로 터미널에서 다른 작업을 계속할 수 있다. 그러나 터미널이 닫히면, 해당 프로세스는 SIGHUP
시그널을 받아 종료된다.
💡 일반적으로 SSH를 통해 프로그램을 실행할 때, 연결이 끊기거나 로그아웃하여 세션이 종료되면, 터미널은 실행한 프로세스들에게 HUP Signal을 전달하여 모든 프로세스를 중지시킨다.
사용 예제
다음과 같이, my_script.py
를 백그라운드에서 실행할 수 있다.
$ python my_script.py &
실행 중에 출력되는 메시지는 여전히 현재 터미널에 표시된다.
nohup
중지 시그널 HUP Signal을 무시하고, 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어가 nohup
명령어이다. nohup
은 “no(=ignore) hangup(hup)”의 약자로, 터미널 종료와 관계없이 작업을 계속 실행할 수 있도록 하는 명령어이다.
포그라운드로 실행하고자 한다면 &
를 제외하고 다음과 같이 기본적으로 수행하면 된다.
$ nohup [command]
nohup
은 터미널 독립성을 갖고 있어, 터미널을 닫아도 작업이 종료되지 않는다. 기본적으로 출력은 nohup.out
파일로 리디렉션되며, 필요하면 출력 파일을 명시적으로 설정할 수 있다.
또한, &
와 함께 사용하면 프로세스를 완전히 분리할 수 있다.
$ nohup [command] [arguments] &
단, 백그라운드에서 실행했을 경우, pid
를 찾은 후 kill
명령어를 이용해줘야만 nohup
프로세스가 정상적으로 종료된다.
nohup
의 출력 결과를 저장하지 않고 싶을 때도 있다. 출력 결과가 많다면 디스크 용량만 차지할 수도 있기 때문이다. 이런 경우 log 파일을 생성하지 않기 위해 /dev/null
과 함께 사용할 수 있다.
$ nohup [command] 1>/dev/null &
사용 예제
다음과 같이 실행하면 my_script.py
는 터미널을 닫아도 계속 실행된다.
$ nohup python my_script &
그리고 출력 메시지는 기본적으로 nohup.out
파일에 저장된다.
nohup
을 사용할 때, 출력 파일을 명시적으로 설정하고 싶다면 >
를 사용하여 리디렉션할 수 있다.
$ nohup python my_script.py > output.log 2>&1 &
> output.log
: 표준 출력 (stdout) 을ouput.log
파일로 리디렉션2>&1
: 표준 에러(stderr)를 표준 출력으로 병합
이렇게 하면 모든 메시지가 output.log
파일에 저장된다.
&와 nohup의 차이점
특징 | & |
nohup |
---|---|---|
백그라운드 실행 여부 | O | O |
터미널 종료 시 동작 | 프로세스 종료 | 프로세스 유지 |
출력 관리 | 터미널에 출력됨 | 기본적으로 nohup.out 로 리디렉션 |
SIGHUP 시그널 처리 |
터미널 종료 시 시그널 전달 | 시그널 무시 |
리눅스에서 백그라운드 실행은 많이 사용되는 기능이다. 단순히 터미널을 유지하는 작업이라면 &
만으로도 충분하지만, 터미널 종료 후에도 작업을 지속해야 한다면 nohup
을 사용하는 것이 적합하다.
Reference