연구실
SSH 세션이 끊겨도 프로세스가 끊기지 않게 하려면..
sw.kim
2025. 4. 30. 16:26
1. 실행 전에 준비했다면
nohup
세션이 끊겨도 job이 계속 실행됨. 출력은 파일로 리다이렉션하는 것이 일반적이다.
nohup your_command > output.log 2>&1 &
tmux (또는 screen)
가상 터미널 세션을 생성해서 그 안에서 job을 실행하면, SSH 세션이 끊겨도 job이 살아 있고, 나중에 다시 접속해서 제어 가능.
tmux # 세션 시작
python train.py # job 실행
[Ctrl + B] → D # 세션 분리(detach)
# 재접속 후
tmux attach # 세션 재접속(attach)
위는 tmux의 예시, 아래는 screen의 예시이다.
screen # 세션 시작
python train.py # job 실행
[Ctrl + A] → D # 세션 분리(detach)
# 재접속 후
screen -r # 세션 다시 붙기
다만 위의 방법들은 이미 실행중인 작업이라면 사용할 수 없다.
미리 셋업을 해두는 것이 좋겠지만, 이미 실행한 작업이고, 재시작을 하기에는 아깝다면 아래 방법이 있다.
2. 이미 실행 중인 job을 SSH 세션이 끊겨도 유지하려면
실행 중인 상태에서 조치할 수 있는 방법
- Ctrl + Z → 현재 실행 중인 job을 중지 (suspend)
- bg → 중지된 job을 백그라운드에서 재개
- disown → 해당 job을 현재 셸로부터 분리
Ctrl + Z
bg
disown
이렇게 하면 SSH 세션이 끊겨도 프로세스는 살아 있음.
단점은, 세션을 다시 붙일 수가 없고 로그도 따로 저장하지 않았다면 출력 확인이 불가능함.
3. 실행 중인 job의 출력 로그를 남기고 싶다면
출력 리다이렉션 필수
아래처럼 실행하면 로그 확인 가능.
python train.py > train.log 2>&1 &
4. 중요한 요약
목적방법
| SSH 끊겨도 job 살리기 | disown, nohup, tmux 등 |
| SSH 끊기고 다시 제어하고 싶을 때 | 무조건 tmux 또는 screen 사용 |
| stdout 로그 남기고 싶을 때 | > log.txt 2>&1 또는 tee 사용 |
disown 방식은 현재 job을 살릴 수는 있지만, 나중에 다른 세션에서 해당 job을 연결할 수 없으며(세션 출력 확인 불가능), 로그또한 확인이 불가능하다. 반면 tmux는 job을 완전히 제어할 수 있으므로 습관적으로 사용하는 게 좋다.