Computing

터미널 종료 후에도 프로그램 계속 실행 방법 (Background 실행, nohup, SIGHUP) 본문

이것저것/CSE

터미널 종료 후에도 프로그램 계속 실행 방법 (Background 실행, nohup, SIGHUP)

jhson989 2023. 5. 11. 21:19

문제 상황 설명

리눅스 환경에서 터미널을 종료시키면 터미널에서 실행시킨 프로그램(ex, python, java, etc.)들도 함께 종료된다. 특히 SSH를 통해 원격으로 서버에 접속하여 프로그램을 실행시키더라도, SSH 연결이 끊기면 자동으로 실행한 프로그램도 종료된다.

 

이는 SIGHUP[1] 시그널(signal) 때문이라고 한다. 위키에 따르면 SIGHUP(signal hang up)는 터미널 hang-up(연결 끊김)이 발생할 때 생성되는 시그널이라고 한다. 터미널이 종료되면 터미널이 관리하는 모든 프로세스들에게 SIGHUP 시그널이 전송되고, SIGHUP 시그널을 받은 프로세스는 기본 설정으로 종료된다고 한다.

 

따라서 프로세스가 SIGHUP 시그널을 받지 않도록 설정하면 문제가 해결된다. 

 

이와 동시에 foreground로 실행되는 프로세스를 Background에서 실행되도록 하는 것도 도움이 된다. Linux는 멀티태스킹 시스템으로 동시에 여러 프로세스를 실행시킬 수 있다. 한 터미널에서 동시에 여러 프로세스를 실행시킬 수 있는데, 이러한 시스템에서는 어떤 프로세스에 유저의 인풋을 주는 것도 중요한 사항일 것이다.

 

터미널에서 실행시킨 프로세스들을 해당 터미널의 Job이라고 부르며, Job들은 foreground 혹은 background에서 실행될 수 있다. foreground에서 실행되는 Job(프로세스)는 유저의 인풋(키보드, 예를 들면 ctrl+c)를 받는다. background에서 실행되는 Job(프로세스)은 유저의 입력을 받지 않는다.

 

 

 

nohup & Background 실행

nohup[2]은 command를 SIGHUP 시그널을 받지 않도록 실행시키는 명령어이다. 따라서 nohup을 이용하여 프로그램을 실행시키면 터미널이 종료되더라도 프로그램은 계속 실행된다. nohup 사용법은 다음과 같다.

 

# nohup [명령어] &
nohup ./intellij &

 

nohup과 함께 실행시키고 싶은 프로그램(executable 파일)을 실행시킨다. 위 예제에서는 intellij 프로그램을 실행시켰다. 이제 터미널을 종료하더라도 intellij는 종료되지 않는다.

 

이때 젤 뒤에 &(ampersand)가 있는 것을 확인할 수 있다. 이것은 nohup과는 상관없이 프로세스를 background에서 실행시키겠다는 의미이다. 이렇게 실행시키면 intellij가 실행되더라도 현재 터미널을 계속 이용할 수 있다.

 

 

 

Reference

[1] https://en.wikipedia.org/wiki/SIGHUP

[2] https://linux.die.net/man/1/nohup