리눅스

머리가 나쁘면 손발이 고생한다

jimsjoo 2026. 1. 16. 01:34

 

현재 진행중인 프로젝트(호스팅 서비스)를 개발하는 단계에서 3개의 프로세스가 필요하다. 

1.  uvicorn - FastAPI로 작성된 백엔드 서버

2. npm run dev - Svelte로 작성된 프런트엔트 서버

3. celery - 도커를 관리할 프로세스

 

그래서 터미널을 3개나 띄우고 추가로 에디터를 실행하고 다른 폴더로 이동하고 뭘 확인하기 위해 필요한 터미널이 하나 더 필요하다. 이러니 터미널을 이동해서 일일이 로그나 서버메시지를 확인하는 게 여간 번거러운 일이 아니다. 게다가 PC를 껐다 켜면 4개의 터미널을 띄우고 명령을 일일이 입력하는 것도 일이다.

그래서 생각해낸게 프로세스를 백그라운드로 돌려 터미널을 하나로 줄이는 것이다. 그런데 '터미널 멀티플렉서'인 tmux라는 물건이 있단다. 백그라운드로 던져놓는 것보다 tmux 같은 도구를 쓰는 것이 훨씬 관리하기 편하다. 

설치는 다음과 같다.

sudo apt update
sudo apt install tmux

 

  1. 세션 만들기: tmux new -s frequi
  2. 명령 실행: npm run dev
  3. 세션에서 나오기 (Detach): Ctrl + B를 누른 후 D를 누른다.
  4. 언제든 다시 들어가기: tmux attach -t frequi

이렇게 하면 프로세스가 멈추지도 않고, 로그를 실시간으로 확인할 수 있다.

🖥️ 실행 후 관리하기

스크립트를 실행한 후에는 터미널이 깨끗하게, 하지만 서비스는 백그라운드에서 돌고 있죠.

  • 상태 확인: tmux attach -t my-project를 치면 3개의 창이 떠 있는 것을 볼 수 있다.
  • 창 이동: Ctrl + B를 누른 후 숫자를 누르면 이동.
    • 0: Frontend 로그 확인
    • 1: API 로그 확인
    • 2: Worker 로그 확인
  • 다시 나오기: Ctrl + B를 누른 후 D를 누르면 서비스는 그대로 둔 채 다시 터미널로 돌아올 수 있다.

나중에 호스팅 서비스를 운영하게 되면 pm2라는 프로세스 매니저를 사용할 수 있다.

  • 설치: npm install -g pm2
  • 실행: pm2 start npm --name "frequi-dev" -- run dev
  • 상태 확인: pm2 list
  • 로그 보기: pm2 logs frequi-dev

pm2를 쓰면 프로세스가 갑자기 죽어도 자동으로 다시 살려주기 때문에 호스팅 서비스를 안정적으로 운영하는 데 필수(죽은 자를 살려주는 명의가 납셨다)


다시 tmux 얘기로 돌아와서, 이를 스크립트로 작성하면

#!/bin/bash
set -e
# 세션 이름 설정
SESSION="myapi-service"

# 1. 새로운 세션을 생성 (백그라운드 실행)
tmux new-session -d -s $SESSION

# 2. Frontend 창 (myapi/frontend 폴더로 이동 후 실행)
tmux rename-window -t $SESSION:0 'frontend'
tmux send-keys -t $SESSION:0 'cd frontend && npm run dev' C-m

# 3. Backend 창 (루트 폴더에서 실행)
tmux new-window -t $SESSION:1 -n 'backend'
tmux send-keys -t $SESSION:1 'uvicorn main:app --reload' C-m

# 4. Worker 창 (루트 폴더에서 실행)
tmux new-window -t $SESSION:2 -n 'worker'
tmux send-keys -t $SESSION:2 'celery -A tasks worker --loglevel=info' C-m

echo "🚀 모든 서비스가 시작되었습니다!"
echo "------------------------------------------"
echo "각 서비스 위치:"
echo "  - Frontend: ./frontend (npm run dev)"
echo "  - Backend:  ./ (uvicorn)"
echo "  - Worker:   ./ (celery)"
echo "------------------------------------------"
echo "접속 명령어: tmux attach -t $SESSION"

 

 

스크립트 작성후 실행하려면 권한을 줘야 한다.

chmod +x start_all.sh

 

서비스를 종료하려면

tmux kill-session -t myapi-service

 

특정 서비스만 재시작하고 싶다면?

  1. tmux attach -t myapi-service로 접속
  2. 해당 창(예: 0번 창)으로 이동 (Ctrl + B 누른 후 0)
  3. Ctrl + C로 프로세스 중지 후 다시 명령어 입력