개요

supervisor 는 python 으로 만들어진 제품으로 프로세스를 모니터링/관리하며 데몬 형식으로 지속적으로 동작해야 하는 프로세스가 있을 경우 유용하게 사용할 수 있습니다.


예로 laravel framework 는 queue 를 사용하려면 콘솔에서 다음 명령을 지속적으로 실행해야 합니다.

php artisan queue:work
CODE


만약 원격으로 서버에 연결했는데 세션이 끊어진다면 Queue 가 동작하지 않게 되므로 이런 경우 supervisor 를 적용하면 됩니다.


supervisor 는 프로세스 모니터링과 관리를 담당하는 데몬인 supervisord 와 커맨드 유틸리티인 supervisorctl 등의 컴포넌트로 구성되어 있으며 사용하려면 Python 3.4 이상 또는 Python 2.7 이상이 필요합니다.

설치

yum 이나 apt 같은 패키지 매니저로 설치할 수 있지만 pip 로도 설치 가능합니다.


apt 로 설치

sudo apt install supervisor
BASH

yum 으로 설치

sudo yum install supervisor
BASH


또는 시스템의 패키지 매니저가 아닌 pip 로 설치해도 됩니다.

pip 로 설치

pip install supervisor
BASH


개인적인 생각으로는 supervisor 데몬 자체는 systemd 와 같은 시스템의 프로세스 관리 매니저로 관리해야 하므로 pip 보다는 apt 나 yum 등 OS 의 패키지 관리자로 설치하는 것이 좋다고 생각합니다.


OS 의 패키지 관리자로 설치했으면 부팅시 자동으로 구동하도록 다음 명령을 실행합니다.

부팅시 자동 구동 설정

sudo systemctl enable supervisor
BASH

RHEL/CentOS 계열은 enable supervisor 대신 enable supervisord 를 사용해야 합니다.


다음 명령으로 supervisor 데몬을 재시작할 수 있습니다.

supervisor 재시작

sudo systemctl restart supervisor
BASH


설정

Ubuntu

supervisor 의 설정 파일은  /etc/supervisor/supervisord.conf 에 위치하며 관리 대상 프로세스용 설정 파일은 /etc/supervisor/conf.d/ 에 .conf 확장자로 끝나는 파일을 만들어 주면 됩니다.


예로 위의 laravel queue 를 실행하는 설정을 추가할 경우 /etc/supervisor/conf.d/laravel-queue-worker.conf 파일을 만들어 줍니다.

/etc/supervisor/conf.d/laravel-queue-worker.conf

[program:laravel-worker]

process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
CODE


RHEL/CentOS

CentOS 계열은 supervisor 설정 파일은 /etc/supervisord.conf 이며 /etc/supervisord.d 에 .ini 로 끝나는 개별 프로세스 설정 파일을 작성해 주면 됩니다. 우분투와 동일하게 경로를 맞추려면 다음과 같이 하면 됩니다.


  1. /etc/supervisord.conf 의 include 항목을 수정합니다.

    /etc/supervisord.conf

    [include]
    # files = supervisord.d/*.ini
    files = /etc/supervisor/conf.d/*.conf
    CODE
  2. 설정 파일을 저장할 디렉터리를 생성합니다.

    mkdir -p /etc/supervisor/conf.d
    CODE
  3. 기존의 프로세스 설정 파일을 이동합니다.

    for i in /etc/supervisord.d/*.ini; do f=`basename $i .ini`; cp $i /etc/supervisor/conf.d/$f.conf; done
    CODE
  4. 기존 폴더를 삭제합니다.

    rm -r /etc/supervisord.d/
    CODE
  5. supervisord 를 재시작합니다.

    bash

    systemctl restart supervisord
    CODE


같이 보기


Ref