매일공부

[Linux] SSH 연결이 끊겨도 계속 도는 모니터링 — nohup / screen 본문

IT/작업기록

[Linux] SSH 연결이 끊겨도 계속 도는 모니터링 — nohup / screen

julian 2026. 7. 30. 13:48

배경

메모리 이슈를 추적하려고 서버에 모니터링 스크립트를 띄워두려는데, 그날따라 SSH 연결이 계속 끊겼다. 그냥 터미널에 명령어를 띄워두면 되는 건지 궁금해서 물어봤다.

Q. SSH에 연결해서 오늘 계속 띄워두면 되는 건가?

맞는 방향이지만, SSH 연결이 자주 끊기는 상황이라면 그냥 터미널에 띄워두면 안 된다. SSH 세션이 끊기는 순간 그 안에서 돌던 프로세스도 같이 죽는다. nohup이나 screen/tmux로 백그라운드에 분리해서 돌려야 안전하다.

방법 1 — nohup

nohup bash -c 'while true; do
  echo "=== $(date "+%Y-%m-%d %H:%M:%S") ===" >> /tmp/mem_track.log
  free -h >> /tmp/mem_track.log
  docker stats --no-stream >> /tmp/mem_track.log
  echo "" >> /tmp/mem_track.log
  sleep 1800
done' > /dev/null 2>&1 &

이렇게 하면:

  • SSH 세션이 끊겨도 nohup 덕분에 백그라운드에서 계속 실행된다
  • 30분(1800초)마다 전체 메모리 상태 + 컨테이너별 메모리 사용량을 로그 파일에 기록한다
  • 나중에 아무 때나 SSH로 다시 들어가서 로그 파일을 확인하면 시간대별 추이를 볼 수 있다

실행 후 확인:

# 잘 돌고 있는지 확인
ps aux | grep "while true" | grep -v grep

# 로그 실시간으로 보기
tail -f /tmp/mem_track.log

중지하고 싶을 때:

ps aux | grep "while true"
kill [해당 PID]

방법 2 — screen (설치되어 있으면 더 편함)

나중에 다시 접속해서 화면을 그대로 들여다보고 싶으면 screen이 더 편하다.

screen -S memcheck

# 화면 안에서
while true; do echo "=== $(date) ==="; free -h; docker stats --no-stream; sleep 1800; done >> /tmp/mem_track.log

# Ctrl+A 누르고 D 눌러서 detach (세션은 백그라운드에서 계속 돔)
# 나중에 다시 보려면:
screen -r memcheck

Q. 이거 어디에 띄우는 건데, 터미널이 아니야?

SSH 터미널 맞다. 다른 어딘가에 새로 띄우는 게 아니다.

  • 지금처럼 SSH로 서버에 접속한 그 터미널 창에 그대로 명령어를 입력하는 것
  • 다만 명령어 앞에 nohup ... &를 붙이면, 그 작업이 터미널 창(SSH 세션)과 연결이 끊겨도 서버 안에서 계속 돌아가도록 **분리(백그라운드)**시키는 것

비유하면:

  • 그냥 명령어만 치면 → SSH 연결(전화 통화)이 끊기는 순간 그 안에서 하던 작업도 같이 끊긴다
  • nohup ... &를 붙이면 → 전화(SSH)는 끊겨도, 서버 안에서는 그 작업이 계속 혼자 돌아간다

정리하면 순서는 이렇다:

  1. 지금 쓰는 SSH 터미널(ssh 계정@서버주소로 접속한 그 창)에
  2. nohup bash -c '...' & 명령어를 그대로 붙여넣고 엔터
  3. 그다음엔 터미널 창을 닫아도, SSH 연결이 또 끊겨도 상관없이 서버 안에서 계속 기록이 쌓인다
  4. 나중에 다시 SSH로 접속해서 로그 파일을 확인하면 그동안 쌓인 기록을 볼 수 있다

즉 새로운 프로그램이나 다른 화면을 여는 게 아니라, 지금 쓰던 그 SSH 터미널에 명령어 하나 입력하는 것으로 끝난다.

Comments