Supervisor, 프로세스 관리, 로그 확인

Apr 10, 2017

Supervisor는 유닉스 계열의 시스템에서 여러 프로세스를 모니터링하고, 제어하는 프로그램이다.

여러 프로젝트를 진행할 때, 개발 서버를 환경에 따라 매번 세팅해야 했다. 이 프로젝트는 이 개발 서버, 저건 저 개발 서버, 프로젝트가 많아지면서 개발 서버가 분산되어 관리하기 어려웠다. Docker로 로컬 PC에서 환경을 돌려서 꽤 오랫동안 정착했었지만, 몇몇 문제점이 나타나게 됐다.

윈도 환경이라 docker-machine을 올리려면 Virtualbox를 써야 하는데, 자원이 부족한 경우가 많이 발생했다. 보안 업데이트 때문에 재부팅 하면 docker-machine 올리고, 컨테이너 올리고, 프로세스를 실행하는 작업을 해줘야 했는데, 꽤 귀찮았다. 그리고 개발할 때는 컨테이너가 실행되고, 자동으로 프로세스가 뜨도록 세팅하지 않아야 할 경우도 많았다.

그래서 원격의 한 개발 서버에서 모든 프로젝트를 작업할 수 있게 환경을 만들었다. 이때, Supervisor를 사용해서 스위치 on/off 하는 방식으로 프로세스를 관리하며 작업을 할 수 있게 만들었다.

Supervisor 설치하기 :

Python 모듈이라서 간단하게 설치할 수 있다.

# supervisor 설치
pip install supervisor

# 설정 파일 생성
echo_supervisord_conf > /etc/supervisord.conf

# 설정 파일 적절히 수정
vi /etc/supervisord.conf

# 데몬 실행
/usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

이제 설정 파일을 어떻게 작성하는지 보겠다.

예:

기존 설정 파일 다른 부분은 수정하지 않고, 다음과 같이 파이선 프로그램을 추가했다.

[program:python_web_application]
command=python -m python_web_application.cli api
directory=/python_web_application_working_dir
autostart=true
설명
command 어떤 커맨드를 실행할지 정의
directory 어떤 디렉터리에서 실행할지 정의
autostart supervisor 데몬이 시작할 때 이 프로세스도 같이 실행할지 정의

이번에는 supervisorctl로 프로세스 관리하는 방법을 알아볼 것이다.

# supervisor 실행
supervisorctl

# 결과
project1_minio_sync             RUNNING   pid 25099, uptime 19:35:34
project1_react_app_es6          RUNNING   pid 30815, uptime 6 days, 0:49:03
project1_zmq_app_api            RUNNING   pid 25407, uptime 18:34:25
project1_zmq_app_broker         RUNNING   pid 5631, uptime 4 days, 20:13:50
project1_zmq_app_worker         RUNNING   pid 18751, uptime 54 days, 0:57:26
...

supervisor> help

이렇게 실행하면 REPL 상태가 된다. 여기서 각종 커맨드를 사용할 수 있다. 위 예에서는 python 프로세스 3개, webpack 프로세스 1개, 파일 동기화하는 프로세스 1개를 보여주고 있다.

# 모든 프로세스 보기
status

# 설정된 모든 프로세스 보기
avail

# 나가기
exit or quit

# foreground로 프로세스를 확인
fg process_name

# 프로세스 시작, 중지, 재시작
start process_name
stop process_name
restart process_name

# supervisord를 재시작
reload

# 설정 파일을 다시 불러온다
reread

# 프로세스를 그룹에 추가
add process_name

현재 다음과 같은 프로세스를 사용하고 있다.

  • Node.JS(Gulp + Webpack 포함) : 프론트엔드, 백엔드 개발
  • Nginx : LUA 개발
  • Elasticsearch
  • Python(Flask, ZeroMQ, …)
  • PHP-FPM

MySQL이나 Apache 등도 foreground로 실행하도록 추가하면 되지만 이미 서비스 스크립트가 있어서 따로 등록하지 않았지만, 이들도 Supervisor를 통해 관리할 수 있다.

production 환경에서도 사용하면 Supervisor를 통해 로그를 볼 수 있고, 프로세스를 관리할 수 있어서 편할 것 같다. 그전에 production에 사용한 사례가 있는지 확인은 필요할 것 같다.

See Also