AI 탐구노트

[우분투] Bash에서 백그라운드 프로세스를 실행하고 종료하는 방법 본문

기술 팁

[우분투] Bash에서 백그라운드 프로세스를 실행하고 종료하는 방법

42morrow 2025. 1. 16. 11:26

 

우분투 bash shell을 이용해 새로 생성한 스크립트를 백그라운드에서 동작시켜야 할 경우가 있습니다. 제 경우, 지난 번에 만든 썸네일 메이커 프로그램을 그런 식으로 백그라운드에서 동작시켜야 하는데요... .bashrc에 등록해 두고 사용하는데 대충 해 뒀더니 사용하면서 불편한 부분들이 많이 생겼습니다. 그래서, 약간 개선해야겠다 싶었죠.

 

그래서, 이번 글에서는 Bash를 이용해 백그라운드에서 작업을 실행하고 관리하는 다양한 방법을 알아 봤습니다. Bash 쉘에서 긴 시간 실행되는 작업을 실행하거나, 로그아웃 후에도 동작하도록 프로세스를 실행하고 싶을 때가 많은데 이를 위해 백그라운드 프로세스를 실행시키고 이를 종료시키는 방법을 알아두면 효율적으로 시스템을 관리할 수 있습니다. 특히, 개발자나 서버 관리자라면 이를 숙지하는 것이 필수적입니다. 이 글에서는 백그라운드 실행 방법과 종료 방법을 간단히 정리해 보겠습니다.

 


백그라운드 실행 방법

1. &를 사용한 기본 백그라운드 실행

명령어 끝에 &를 붙이면 해당 프로세스가 백그라운드에서 실행됩니다. 이 경우, 터미널이 열려 있는 동안에만 프로세스가 유지되며 터미널 종료와 함께 해당 프로세스도 종료됩니다. 

$ ./script.sh &

 

2. nohup을 이용한 실행

nohup은 프로세스가 터미널 세션과 무관하게 계속 실행되도록 합니다. 원격에서 이용할 목적으로 서버 쪽에 프로세스를 띄워 놓을 때 많이 사용하는 방식입니다. 1번의 &만 이용하는 방법에서는 원격 접속을 끊는 순간 프로세스도 종료되는데 초보 때는 그런 실수를 많이 하죠.

$ nohup ./script.sh &

 

기본적으로 nohup.out 파일에 로그가 저장되는데 로그 파일을 별도로 지정하려면 다음과 같이 설정합니다. 

$ nohup ./script.sh > output.log 2>&1 &

 

3. disown을 사용하여 현재 세션과 분리

disown이미 실행 중인 백그라운드 작업을 현재 셸 세션에서 분리해 터미널 종료 후에도 프로세스가 계속 실행되도록 할 수 있습니다. 하지만, 이렇게 할 바에는 그냥 nohup을 사용하는 것이 편하죠. 이 방식은 백그라운드로 작업을 시키다가 터미널 종료를 해야 하는데 프로세스는 계속 유지하고 싶을 때 선택하게 될 것 같습니다.

$ ./script.sh &
$ disown

 

 

4. tmux 또는 screen 세션 사용

세션 관리 툴을 사용하면 더 강력한 제어가 가능합니다. 아래 소개되는 tmux의 경우, 백그라운드 작업화를 떠나서 정말 다양한 작업을 수행할 수 있습니다. 프로세스 세션을 docker처럼 띄워두고 그 속으로 들어갔다 나왔다를 하면서 작업이 가능하죠. 제 경우, 동시에 몇개의 프로세스를 병렬로 띄워서 서로 간의 통신을 해야하는 데모를 만들 때 활용한 바 있습니다. 

$ tmux new -s my_session
$ ./script.sh

 

tmux 사용 시 세션과 관련된 부분만 짧게 소개하면 다음과 같이 진행하면 됩니다. 

  • 세션 분리 : Ctrl+b, d
  • 세션 재접속 :
$ tmux attach -t my_session

 

참고로 이미 아시는 분도 있겠지만, 안드로이드폰에서도 tmux 앱이 있습니다. 즉 폰에서도 스크립트를 구동시킬 수 있다는 얘기죠. 물론 이를 위해서는 약간의 작업들은 필요합니다. 


프로세스 종료 방법

1. 프로세스 식별

ps 명령어로 실행 중인 프로세스 PID를 확인할 수 있습니다. 

$ ps aux | grep "script.sh"

 

 

2. 프로세스 종료

이후 해당 PID를 kill 커맨드를 이용해 종료합니다.

 

$ kill -9 <PID>

 

3. pkill을 사용한 종료

PID를 식별하는 위의 과정을 거치지 않고, 바로 실행 중인 프로세스 이름으로 종료시키는 것은 pkill을 이용합니다. 단, 이 때 -f 옵션은 프로세스를 실행할 때 사용한 전체 명령어를 기준으로 검색하게 됩니다. 

$ pkill -f "script.sh"

 

 

4. killall을 이용한 종료

 

killall을 이용하면 특정 이름을 가진 모든 프로세스를 종료시킬 수 있습니다. 

$ killall script.sh

 


예제) 특정 명령어를 백그라운드에서 실행하고 종료하기

제 경우, .bashrc에 다음과 같이 thumb 함수를 정의해서 사용합니다. 그러면 터미널 어디서는 필요 시 실행시킬 수 있습니다. 로그인 시 자동으로 백그라운드에서 실행하도록 해 둬도 되는데 안 쓸 때는 괜한 CPU 부하를 줄 수도 있으니 필요할 때만 사용하도록 한 것이죠.

thumb(){
    cd ~/coding/thumbnail_maker_py; nohup uvicorn main:app --reload > /dev/null 2>&1 &
}

 

이번에 개선한 부분은 .bashrc 파일에 해당 프로세스를 종료시키는 추가적인 alias를 두는 것이었습니다. 다음과 같이 말이죠.

alias killthumb="pkill -f 'uvicorn main:app --reload'"

 

시작할 때는 thumb, 종료 시에는 killthumb 이렇게 터미널 상에서 커맨드를 실행하면 됩니다. 


추가 팁 : 로그 남기지 않기

shell 실행 시 로그를 남기지 않으려면 다음과 같이 리디렉션을 해 주면 됩니다. 

$ nohup ./script.sh > /dev/null 2>&1 &

 

추가 팁 : 실행 중인 모든 프로세스 모니터링하기

실행 중인 모든 프로세스를 모니터링하려면 top 또는 htop을 사용하면 됩니다. 개인적으론 htop 추천!

$ htop