리눅스 시스템에서 프로세스를 백그라운드로 실행하고 제어하는 것은 서버 관리나 장시간 실행되는 작업을 다룰 때 필수적인 기술입니다. 터미널 세션이 종료되어도 프로세스가 계속 실행되도록 하거나, 여러 작업을 효율적으로 관리해야 할 때 이런 명령어들이 큰 도움이 됩니다. 이 글에서는 nohup, screen, tmux, disown 등 리눅스에서 프로세스를 제어하고 백그라운드에서 실행 관리하는 다양한 방법을 상세히 알아보겠습니다.
1. 백그라운드 실행의 기본 개념
리눅스 시스템에서 명령어를 실행하면 기본적으로 포그라운드(foreground)에서 실행됩니다. 이는 해당 명령어가 완료될 때까지 터미널이 다른 명령어를 받아들이지 않는다는 의미입니다. 하지만 백그라운드(background)에서 명령어를 실행하면, 해당 명령어가 실행되는 동안에도 터미널에서 다른 작업을 계속할 수 있습니다.
기본적인 백그라운드 실행은 명령어 뒤에 &
를 붙이는 것으로 가능합니다:
command &
하지만 이 방식은 터미널 세션이 종료되면 백그라운드 프로세스도 함께 종료된다는 한계가 있습니다. 이러한 한계를 극복하기 위해 nohup, screen, tmux, disown 같은 명령어들이 필요합니다.
2. nohup – 터미널 세션과 무관하게 프로세스 실행하기
기본 개념
nohup(no hang up)은 터미널이 종료(hang up)되어도 프로세스가 계속 실행되도록 하는 명령어입니다. 일반적으로 백그라운드 실행 기호 &
와 함께 사용합니다.
기본 사용법
nohup command [arguments] &
주요 옵션
- nohup은 특별한 옵션이 많지 않습니다. 기본적으로는 출력을 nohup.out 파일로 리다이렉트합니다.
사용 예시
웹 서버를 백그라운드에서 실행하고 로그를 특정 파일로 저장하는 예시:
nohup python3 server.py > server.log 2>&1 &
이 예시에서는 Python 웹 서버를 시작하고, 표준 출력(stdout)을 server.log 파일로 리다이렉트하며, 표준 에러(stderr)도 같은 파일로 리다이렉트합니다. 마지막 &
는 프로세스를 백그라운드에서 실행하라는 의미입니다.
대용량 파일 압축을 백그라운드로 실행하는 예시:
nohup tar -czf backup.tar.gz /home/user/documents &
이 명령은 문서 디렉토리를 압축하는 작업을 백그라운드에서 실행하며, 터미널을 닫아도 계속 진행됩니다.
주의사항
- nohup.out 파일이 너무 커지지 않도록 주기적으로 확인하는 것이 좋습니다.
- 프로세스가 정상적으로 백그라운드에서 실행되고 있는지 확인하려면
ps aux | grep command
를 사용합니다.
3. screen – 가상 터미널 세션 관리자
기본 개념
screen은 여러 가상 터미널 세션을 생성하고 관리할 수 있게 해주는 유틸리티입니다. 각 세션은 독립적으로 동작하며, 터미널 연결이 끊어져도 세션 내의 프로세스는 계속 실행됩니다.
설치 방법
대부분의 리눅스 배포판에서는 기본적으로 설치되어 있지 않으므로 다음과 같이 설치할 수 있습니다:
# Debian/Ubuntu
sudo apt-get install screen
# CentOS/RHEL
sudo yum install screen
주요 옵션
-S [세션이름]
: 새 세션 생성 시 이름 지정-r [세션이름]
: 기존 세션에 다시 연결(재접속)-ls
: 현재 실행 중인 세션 목록 표시-d [세션이름]
: 특정 세션 분리(detach)
사용 예시
새로운 screen 세션 시작하기:
screen -S mysession
이 명령은 ‘mysession’이라는 이름의 새 screen 세션을 생성합니다. 이 세션 내에서 실행하는 모든 명령은 세션이 분리되어도 계속 실행됩니다.
실행 중인 세션에서 빠져나오기(detach): screen 세션 내에서 Ctrl+a
를 누른 다음 d
를 누르면 현재 세션에서 분리(detach)됩니다. 세션은 계속 실행 중이지만 터미널에서는 분리된 상태가 됩니다.
실행 중인 세션 목록 확인하기:
screen -ls
이 명령은 현재 시스템에서 실행 중인 모든 screen 세션 목록을 보여줍니다.
분리된 세션에 다시 연결하기:
screen -r mysession
‘mysession’이라는 이름의 세션에 다시 연결합니다.
주요 단축키
screen 내에서 사용할 수 있는 중요한 단축키들입니다:
Ctrl+a c
: 새 창 생성Ctrl+a n
: 다음 창으로 이동Ctrl+a p
: 이전 창으로 이동Ctrl+a d
: 현재 세션에서 분리(detach)Ctrl+a k
: 현재 창 종료Ctrl+a ?
: 도움말 표시
주의사항
- screen 세션이 너무 많아지면 관리가 어려울 수 있으므로, 사용이 끝난 세션은 종료하는 것이 좋습니다.
- 오래된 세션을 정리하려면
screen -wipe
명령을 사용합니다.
4. tmux – 터미널 멀티플렉서
기본 개념
tmux는 screen과 유사하게 터미널 세션을 관리하는 도구지만, 더 많은 기능과 유연성을 제공합니다. 창 분할, 패널 관리, 세션 공유 등 더 다양한 기능을 갖추고 있습니다.
설치 방법
# Debian/Ubuntu
sudo apt-get install tmux
# CentOS/RHEL
sudo yum install tmux
주요 옵션
new -s [세션이름]
: 새 세션 생성attach -t [세션이름]
: 기존 세션에 연결ls
: 실행 중인 세션 목록 표시kill-session -t [세션이름]
: 세션 종료
사용 예시
새로운 tmux 세션 생성하기:
tmux new -s mysession
이 명령은 ‘mysession’이라는 이름의 새 tmux 세션을 생성합니다.
현재 세션에서 빠져나오기(detach): 세션 내에서 Ctrl+b
를 누른 다음 d
를 누르면 현재 세션에서 분리(detach)됩니다.
실행 중인 세션 목록 확인하기:
tmux ls
이 명령은 현재 실행 중인 모든 tmux 세션을 나열합니다.
기존 세션에 다시 연결하기:
tmux attach -t mysession
‘mysession’이라는 이름의 세션에 다시 연결합니다.
화면 분할 예시: 세션 내에서 Ctrl+b
를 누른 다음 %
를 누르면 화면이 수직으로 분할됩니다. Ctrl+b
를 누른 다음 "
를 누르면 화면이 수평으로 분할됩니다.
주요 단축키
Ctrl+b c
: 새 창 생성Ctrl+b n
: 다음 창으로 이동Ctrl+b p
: 이전 창으로 이동Ctrl+b %
: 창을 수직으로 분할Ctrl+b "
: 창을 수평으로 분할Ctrl+b 화살표
: 분할된 창 사이를 이동Ctrl+b d
: 현재 세션에서 분리(detach)
주의사항
- tmux는 강력한 기능을 제공하지만, 학습 곡선이 있습니다.
.tmux.conf
파일을 통해 설정을 사용자 정의할 수 있습니다.
5. disown – 실행 중인 프로세스를 현재 셸에서 분리하기
기본 개념
disown은 이미 실행 중인 작업을 현재 셸에서 분리하는 데 사용됩니다. 주로 프로세스를 시작한 후에 백그라운드로 전환해야 할 경우 유용합니다.
기본 사용법
command &
jobs
disown %job_number
또는 모든 백그라운드 작업을 분리하려면:
disown -a
주요 옵션
-h
: 작업을 분리하지만, 터미널이 닫힐 때 SIGHUP 신호를 받지 않도록 합니다.-a
: 모든 작업에 적용합니다.-r
: 실행 중인 작업에만 적용합니다.
사용 예시
프로세스를 실행한 후 백그라운드로 전환하고 분리하는 예시:
# 먼저 프로세스 실행
python3 long_running_script.py
# Ctrl+Z를 눌러 일시 중지
# 백그라운드로 계속 실행
bg
# 작업 번호 확인
jobs
# 작업 분리
disown %1
이 예시에서는 스크립트를 실행한 후, Ctrl+Z
로 일시 중지하고, bg
명령으로 백그라운드로 전환한 다음, disown %1
로 첫 번째 작업을 현재 셸에서 분리합니다.
모든 백그라운드 작업을 한 번에 분리하는 예시:
disown -a
이 명령은 현재 실행 중인 모든 백그라운드 작업을 셸에서 분리합니다.
주의사항
- disown된 프로세스는 셸에서 분리되지만, 출력은 여전히 터미널에 표시될 수 있습니다. 출력을 파일로 리다이렉트하려면 프로세스를 시작할 때 미리 설정해야 합니다.
- disown된 프로세스는 jobs 명령에서 더 이상 보이지 않습니다. 프로세스 상태를 확인하려면
ps
명령을 사용해야 합니다.
6. bg와 fg – 작업 제어의 기본 명령어
기본 개념
bg
와 fg
는 리눅스의 작업 제어(job control) 기능을 사용하는 기본 명령어입니다. bg
는 중지된 작업을 백그라운드에서 계속 실행하고, fg
는 백그라운드 작업을 포그라운드로 가져옵니다.
기본 사용법
# 백그라운드로 전환
bg %job_number
# 포그라운드로 전환
fg %job_number
사용 예시
작업을 일시 중지하고 백그라운드로 전환하는 예시:
# 장시간 실행되는 명령어 시작
find / -name "*.log"
# Ctrl+Z를 눌러 일시 중지
# 백그라운드에서 계속 실행
bg
이 예시에서는 파일 검색 명령을 실행한 후, Ctrl+Z
로 일시 중지하고, bg
명령으로 백그라운드에서 계속 실행합니다.
여러 작업 간 전환하는 예시:
# 첫 번째 작업 시작 후 백그라운드로 전환
sleep 100 &
# 두 번째 작업 시작 후 백그라운드로 전환
sleep 200 &
# 작업 목록 확인
jobs
# 첫 번째 작업을 포그라운드로 가져오기
fg %1
이 예시에서는 두 개의 sleep 명령을 백그라운드에서 실행한 후, fg %1
명령으로 첫 번째 작업을 포그라운드로 가져옵니다.
주의사항
- 백그라운드 작업은 여전히 터미널과 연결되어 있으므로, 터미널을 닫으면 작업이 종료됩니다. 이를 방지하려면 nohup이나 disown을 함께 사용해야 합니다.
jobs
명령을 사용하여 현재 셸의 작업 목록을 확인할 수 있습니다.
7. 명령어 조합, 더 고급지게 사용하기
nohup과 disown 조합하기
이미 실행 중인 프로세스를 터미널 종료와 무관하게 유지하는 방법:
# 프로세스 시작
command
# Ctrl+Z로 일시 중지
# 백그라운드로 전환
bg
# 프로세스 분리
disown -h %1
이 조합은 이미 실행 중인 프로세스를 백그라운드로 전환하고, disown을 사용하여 터미널 종료 시 SIGHUP 신호를 무시하도록 합니다.
screen과 tmux 활용하기
장기 실행 태스크를 관리하는 예시:
# screen을 사용하여 새 세션 시작
screen -S compile
# 컴파일 작업 시작
make -j4
# Ctrl+a d로 세션 분리
# 나중에 세션에 다시 연결
screen -r compile
이 예시에서는 screen을 사용하여 컴파일 작업을 위한 별도의 세션을 만들고, 작업을 시작한 후 세션을 분리하여 나중에 다시 연결할 수 있게 합니다.
프로세스 모니터링과 함께 사용하기
백그라운드 프로세스의 상태를 모니터링하는 방법:
# 백그라운드에서 프로세스 시작
nohup ./long_process &
# 프로세스 ID 확인
echo $!
# 프로세스 ID를 파일에 저장
echo $! > process_id.txt
# 나중에 프로세스 상태 확인
ps -p $(cat process_id.txt)
이 예시에서는 프로세스 ID를 파일에 저장하여 나중에 해당 프로세스의 상태를 쉽게 확인할 수 있게 합니다.
8. 각 명령어는 언제 사용하는게 좋을까?
언제 nohup을 사용해야 할까?
- 단순히 터미널을 닫아도 프로세스가 계속 실행되기를 원할 때
- 간단한 명령어를 백그라운드에서 실행할 때
- 추가 기능이 필요 없고 출력 로그만 필요할 때
언제 screen/tmux를 사용해야 할까?
- 여러 터미널 세션을 관리해야 할 때
- 세션에 나중에 다시 연결하여 진행 상황을 확인해야 할 때
- 여러 창으로 작업을 분할해야 할 때
- 다른 사용자와 세션을 공유해야 할 때(특히 tmux)
언제 disown을 사용해야 할까?
- 이미 실행 중인 프로세스를 셸에서 분리해야 할 때
- 프로세스를 시작한 후에 백그라운드로 전환해야 할 때
- 스크립트 내에서 백그라운드 프로세스를 관리할 때
9. 트러블슈팅 및 자주 발생하는 문제
백그라운드 프로세스가 예기치 않게 종료되는 경우
가능한 원인 및 해결책:
- SIGHUP 신호:
nohup
또는disown -h
를 사용하여 SIGHUP 신호를 무시하도록 설정 - 메모리 부족: 시스템 리소스를 확인하고, 필요하면 스왑 공간 증가
- 출력 오류: 표준 출력과 표준 에러를 명시적으로 리다이렉트
nohup command > output.log 2> error.log &
screen/tmux 세션을 찾을 수 없는 경우
가능한 원인 및 해결책:
- 세션 종료:
screen -ls
또는tmux ls
로 실행 중인 세션 확인 - 다른 사용자가 세션 생성: sudo를 사용하여 다른 사용자의 세션 확인
- 세션 이름 오타: 정확한 세션 이름 확인
프로세스가 종료되지 않는 경우
좀비 프로세스 처리 방법:
# 프로세스 ID 확인
ps aux | grep process_name
# SIGTERM 신호 보내기
kill process_id
# 강제 종료가 필요한 경우
kill -9 process_id
10. 도움 되는 팁을 드리자면…
주요 명령어 요약
- nohup: 터미널 종료 후에도 프로세스 실행 유지
- screen/tmux: 가상 터미널 세션 관리
- disown: 실행 중인 프로세스를 셸에서 분리
- bg/fg: 작업을 백그라운드/포그라운드로 전환
실전 팁
- 중요한 백그라운드 작업은 항상 로그 파일로 출력을 리다이렉트하세요.
- 장시간 실행되는 작업은 screen이나 tmux를 사용하여 관리하세요.
- 프로세스를 시작할 때
$!
를 사용하여 프로세스 ID를 저장하면 나중에 관리하기 편리합니다. - 백그라운드 프로세스의 리소스 사용량을 주기적으로 확인하세요.
- 중요한 작업은 cron job으로 설정하여 시스템 재부팅 후에도 자동으로 시작되도록 하세요.
리눅스에서 프로세스 제어와 백그라운드 실행 관리는 시스템 관리자와 개발자에게 필수적인 기술입니다. nohup, screen, tmux, disown 등의 도구를 상황에 맞게 활용하면 더 효율적으로 작업을 관리할 수 있습니다. 각 도구의 장단점을 이해하고 적절히 조합하여 사용하면 리눅스 시스템에서의 생산성을 크게 향상시킬 수 있습니다. 🙂