Linux

[Linux] 백그라운드 실행하기 : &와 nohup

nayoungs 2024. 11. 17. 02:00
728x90

리눅스 시스템에서 작업을 수행하다 보면, 긴 시간이 걸리는 명령어를 실행해야 할 때가 있다. 그러나 터미널을 닫거나 세션이 끊기면 작업이 종료되는 문제가 생길 수 있다. 이를 방지하기 위해 리눅스는 여러가지 백그라운드 실행 방법을 제공하고 있다. 오늘은 그 중에서도 가장 대표적인 &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

 

 

 

 

728x90