English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 기반 프로세스 관리 도구 supervisor 사용 가이드

Supervisor는 Python을 기반으로 한 프로세스 관리 도구로, Unix에서만 실행할 수 있습니다.-Like의 시스템에서는, 즉 Windows에서 실행할 수 없습니다. Supervisor 공식 버전은 현재 Python에서만 실행할 수 있습니다. 2.4 위 버전이지만, Python에서 실행할 수 없습니다. 3 위, 하지만 이미 Python이 있습니다. 3 의 이식 버전 supervisor-py3k.

어떤 경우에 프로세스 관리가 필요할까요? 즉, 데몬 프로세스로 실행되는 프로그램을 실행할 때입니다. 예를 들어, 배경 작업이나 제가 가장 자주 사용하는 것은 Tornado를 기반으로 한 Web 프로그램을 시작하고 관리하는 것입니다.

또한, Supervisor는 명령 줄에서 프로그램이 출력하는 로그를 매우 유용하게 관리할 수 있으며, 로그를 사용자 정의 로그 파일로 전송하고 로그 파일 크기에 따라 로그를 분할할 수 있습니다.

Supervisor는 두 가지 주요 구성 요소를 가지고 있습니다:

  1. supervisord는 Supervisor를 실행할 때 supervisord 프로세스를 시작하며, 관리할 프로세스를 시작하고 자신의 서브 프로세스로 시작하며, 관리할 프로세스가 고장났을 때 자동으로 재시작할 수 있습니다.
  2. supervisorctl은 명령줄 관리 도구로, stop, start, restart 등의 명령을 실행하여 서브 프로세스를 관리할 수 있습니다.

설치

sudo pip install supervisor

설정 파일을 생성합니다

echo_supervisord_conf > /etc/supervisord.conf

권한이 없는 문제가 발생하면 다음 명령을 사용할 수 있습니다

sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"

설정 파일 설명

관리할 프로세스를 설정하는 방법을 알고 싶다면 supervisord.conf을 열면 됩니다. 그 안에는 상세한 설명이 포함되어 있습니다.

설정 파일을 엽니다

vim /etc/supervisord.conf

기본 설정 파일은 다음과 같습니다. 하지만 여기에 주의해야 할 점이 있습니다. supervisord.pid 및 supervisor.sock는 다음에 위치하고 있습니다. /tmp 디렉토리 아래에 있지만 /tmp 디렉토리는 일시적인 파일을 저장하는 곳이며, 그 안의 파일은 Linux 시스템에 의해 제거됩니다. 이 파일들이 사라지면 supervisorctl을 통해 restart와 stop 명령을 실행할 수 없게 됩니다. 그 대신 unix:만 받게 됩니다.///tmp/supervisor.sock不存在의 오류 .

[unix_http_server]
;file=/tmp/supervisor.sock  ; (the path to the socket file)
; 변경하려면 /var/run 디렉토리, 시스템에 의해 지워지지 않도록 설정
file=/var/run/supervisor.sock  ; (the path to the socket file)
;chmod=0700         ; socket file mode (default 0700)
;chown=nobody:nogroup    ; socket file uid:gid owner
;username=user       ; (기본적으로 사용자 이름 없음 (서버 열림))
;password=123        ; (기본적으로 비밀번호 없음 (서버 열림))
;[inet_http_server]     ; inet (TCP) 서버 기본적으로 비활성화
;port=127.0.0.1:9001    ; (ip_address:port specifier, *:port for ;all iface)
;username=user       ; (기본적으로 사용자 이름 없음 (서버 열림))
;password=123        ; (기본적으로 비밀번호 없음 (서버 열림))
...
[supervisord]
;logfile=/tmp/supervisord.log ; (주요 로그 파일;기본 $CWD/supervisord.log)
; 변경하려면 /var/log 디렉토리, 시스템에 의해 지워지지 않도록 설정
logfile=/var/log/supervisor/supervisord.log ; (주요 로그 파일;기본 $CWD/supervisord.log)
logfile_maxbytes=50MB    ; (주요 로그 파일 바이트 크기 b4 rotation;기본 50MB)
logfile_backups=10      ; (주요 로그 파일 회전 백업 수;기본 10; 상대적 시작 우선순위 (기본)
loglevel=info        ; (로그 수준;기본 info; 다른: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;기본 supervisord.pid)
; 변경하려면 /var/run 디렉토리, 시스템에 의해 지워지지 않도록 설정
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;기본 supervisord.pid)
...
; supervisord를 시작하는 사용자를 설정, 일반적으로 root 사용자로 시작하지 않도록 권장, 정말로 이렇게 하고자 한다면
;user=chrism         ; (기본은 현재 사용자, root인 경우 필요, 기본은 현재 사용자)
...
[supervisorctl]
; 'unix_http_server' 내의 설정과 일치해야 합니다
;serverurl=unix:///tmp/supervisor.sock; unix 소켓을 사용하도록 설정// unix 소켓의 URL
; 변경하려면 /var/run 디렉토리, 시스템에 의해 지워지지 않도록 설정
serverurl=unix:///var/run/supervisor.sock; unix 소켓을 사용하도록 설정// unix 소켓의 URL
;serverurl=http://127.0.0.1:9001 ; http: 사용// 인터넷 소켓을 지정하는 URL
;username=chris       ; 설정되어 있다면 http_username와 같아야 합니다
;password=123        ; 설정되어 있다면 http_password와 같아야 합니다
...

기본적으로, 프로세스의 로그 파일은50MB 시, 분할됩니다. 최대로 유지할10개 파일, 당연히 이 설정은 각 프로세스에 대해도 별도로 설정할 수 있습니다.

권한 문제

설정 파일을 설정好后, 위의 설정 파일에 추가된 디렉토리를 먼저 생성해야 합니다. 사용자 user를 지정한 경우, oxygen을 예로 들어, 관련 파일의 권한 문제를 주의해야 합니다. 로그 파일도 포함하여, 권한이 없는 오류가 발생할 수 있습니다. 예를 들어, oxygen 사용자를 설정하고 supervisord를 시작했을 때 오류가 발생하는 경우

오류: HTTP 서버를 열 수 없음: socket.error reported errno.EACCES (13; 상대적 시작 우선순위 (기본)

위의 설정 파일에서 /var/run 디렉토리, oxygen 사용자에게 supervisord 실행 권한을 부여하지 않았습니다./var/run 폴더는 실제로 링크로 설정되어 있습니다 /run을 통해 /run 권한

sudo chmod 777 /run

이렇게는 조금 간단하고 무서워 보일 수 있습니다. 따라서 위의 구성 파일에서 .sock, .pid 등의 파일을 다른 폴더로 변경하고 적절한 권한을 보장해야 합니다. 일반적으로 root 사용자로 supervisord 프로세스를 시작한 후, 관리하는 프로세스에서 특정 사용자로 이 프로세스를 시작하는 것이 좋습니다.

브라우저를 통해 관리

supervisor는 브라우저를 통해 프로세스를 관리하는 방법을 제공합니다. 다음 몇 행을 주석 처리하면 됩니다.

;[inet_http_server]     ; inet (TCP) 서버 기본적으로 비활성화
;port=127.0.0.1:9001    ; (ip_address:port specifier, *:port for ;all iface)
;username=user       ; (기본적으로 사용자 이름 없음 (서버 열림))
;password=123        ; (기본적으로 비밀번호 없음 (서버 열림))
[supervisorctl]
...
;serverurl=http://127.0.0.1:9001 ; http: 사용// 인터넷 소켓을 지정하는 URL
;username=chris       ; 설정되어 있다면 http_username와 같아야 합니다
;password=123        ; 설정되어 있다면 http_password와 같아야 합니다

 

include 사용

구성 파일의 마지막에 [include] 구성 항목이 있습니다. Nginx와 마찬가지로, 특정 폴더하위의 모든 구성 파일을 include할 수 있습니다. 이렇게 하면 각 프로세스나 관련된 몇 가지 프로세스의 구성을 각각의 파일로 별도로 작성할 수 있습니다.

[include]
files = /etc/supervisord.d/*.ini

프로세스 구성 예제

예로 들어

; 프로세스 이름을 설정합니다. supervisorctl을 사용하여 프로세스를 관리할 때는 이 프로세스 이름을 사용해야 합니다
[program:your_program_name] 
command=python server.py --port=9000
;numprocs=1         ; 기본적으로1
;process_name=%(program_name)s  ; 기본적으로 %(program_name)s으로 설정됩니다, 즉 [program:x]의 x입니다
directory=/home/python/tornado_server ; command 실행 전에 먼저 작업 디렉토리로 전환
user=oxygen         ; 이 프로세스를 시작하기 위해 oxygen 사용자를 사용
; 프로그램이 충돌할 때 자동으로 재시작됩니다. 재시작 횟수는 제한되어 있으며, 기본值为3번
autorestart=true      
redirect_stderr=true    ; 출력 로그를 다시 전송
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

로그 수준 설정

loglevel은 로그의 수준을 지정합니다. Python의 print 문장을 사용하여 출력된 로그는 로그 파일에 기록되지 않으며, Python의 logging 모듈을 사용하여 지정된 수준의 로그를 출력해야 합니다

여러 개의 프로세스

공식 문서의 정의에 따르면, [program:x]는 실제로는 동일한 특성이나 동일한 유형의 프로세스 그룹을 나타내며, 즉 [program:x]는 여러 개의 프로세스를 시작할 수 있습니다. 이 그룹의 구성원은 numprocs와 process_name 두 가지 매개변수로 결정됩니다. 이 문장이 무엇을 의미하는지, 이 예제를 보겠습니다

; 프로세스 이름을 설정합니다. supervisorctl을 사용하여 프로세스를 관리할 때는 이 프로세스 이름을 사용해야 합니다
[program:foo] 
; command에서 python 표현식을 사용하여 각 프로세스에 다른 매개변수를 전달할 수 있습니다
command=python server.py --port=90%(process_num)02d
directory=/home/python/tornado_server ; command 실행 전에 먼저 작업 디렉토리로 전환
; numprocs가 아니면1process_name의 표현식에는 반드시 process_num을 포함하여 다른 프로세스를 구분해야 합니다
numprocs=2          
process_name=%(program_name)s_%(process_num)02d; 
user=oxygen         ; 이 프로세스를 시작하기 위해 oxygen 사용자를 사용
autorestart=true      ; 프로그램이 충돌할 때 자동으로 재시작
redirect_stderr=true    ; 출력 로그를 다시 전송
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

위의 예제는 두 개의 프로세스를 시작하며, process_name은 foo:foo_0입니다1 하고 foo:foo_02이렇게 하면 [program:x] 설정 항목을 사용하여 매우 유사한 프로세스 그룹을 시작할 수 있습니다

추가로 두 가지 설정 항목을 소개합니다 stopasgroup과killasgroup

; 기본적으로 false입니다. true로 설정하면, 프로세스가 stop 신호를 받으면 자동으로 해당 신호를 그 프로세스의 자식 프로세스에 보냅니다. 이 설정이 true로 설정되면, killasgroup도 자동으로 true로 설정됩니다. 예를 들어, Debug 모드에서 Flask를 사용할 때, Flask는 받은 stop 신호를 자식 프로세스에도 전달하지 않기 때문에 이 설정 항목을 설정해야 합니다.

stopasgroup=false       ; send stop signal to the UNIX process 
; 기본적으로 false입니다. true로 설정하면, 프로세스가 kill 신호를 받으면 자동으로 해당 신호를 그 프로세스의 자식 프로세스에 보냅니다. 이 프로그램이 python의 multiprocessing을 사용하면 자동으로 그 자식 스레드를 중지할 수 있습니다.
killasgroup=false       ; SIGKILL the UNIX process group (def false)

更多상세한 설정 예제는 다음을 참고하십시오. 공식 문서는 여기에 있습니다

;[program:theprogramname]
;command=/bin/cat       ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1          ; number of processes copies to start (def 1; 상대적 시작 우선순위 (기본)
;directory=/tmp        ; directory to cwd to before exec (def no cwd)
;umask=022           ; umask for process (default None)
;priority=999         priority= 999; 상대적 시작 우선순위 (기본)
;autostart=true        ; start at supervisord start (default: true)
;autorestart=unexpected    ; whether/when to restart (default: unexpected)
;startsecs=1          ; number of secs prog must stay running (def. 1; 상대적 시작 우선순위 (기본)
;startretries=3        ; 시리얼 시작 실패 최대 수 (기본 3; 상대적 시작 우선순위 (기본)
;exitcodes=0,2         ; 프로세스의 '예상' 종료 코드 (기본 0,2; 상대적 시작 우선순위 (기본)
;stopsignal=QUIT        ; 프로세스를 종료하는 신호 (기본 TERM)
;stopwaitsecs=10        ; 대기할 최대 수 초 b4 SIGKILL (기본) 10; 상대적 시작 우선순위 (기본)
;stopasgroup=false       ; UNIX 프로세스 그룹에 stop 신호 전송 (기본 false)
;killasgroup=false       ; UNIX 프로세스 그룹에 SIGKILL (기본 false)
;user=chrism          ; 프로그램을 실행하기 위해 이 UNIX 계정에 setuid 설정
;redirect_stderr=true     ; proc stderr 를 stdout 로 리디렉션 (기본 false)
;stdout 로그 파일=/a/경로    ; stdout 로그 경로, none 은 없음; 기본 AUTO
;stdout 로그 파일 최대 바이트 수=1MB  ; 최대 로그 파일 바이트 수 b4 회전 (기본) 50MB)
;stdout 로그 파일 백업 개수=10   ; stdout 로그 파일 백업 개수 (기본 10; 상대적 시작 우선순위 (기본)
;stdout_capture_maxbytes=1;stderr_capture_maxbytes=
;stdout_events_enabled=false  ; stdout 쓰기에 이벤트 발생 (기본 false)
;stderr 로그 파일=/a/경로    ; stderr 로그 경로, none 은 없음; 기본 AUTO
;stderr 로그 파일 최대 바이트 수=1MB  ; 최대 로그 파일 바이트 수 b4 회전 (기본) 50MB)
;stderr_logfile_backups=10   ;stderr_logfile_backups= 10; 상대적 시작 우선순위 (기본)
; stderr 로그 파일 백업의 개수 (기본적으로)1;stderr_capture_maxbytes=
MB  ; 'capturemode'에 있는 바이트 수 (기본적으로 0)
;stderr_events_enabled=false  ; stderr 쓰기에 대한 이벤트 발생 (기본적으로 false)1;environment=A="2",B="
"    ; 프로세스 환경 추가 설정 (기본적으로 추가되지 않음)

;serverurl=AUTO ; serverurl 계산을 대체합니다 (childutils)

여러 프로세스를 그룹으로 관리합니다

Supervisor는 또한 다른 프로세스 그룹 관리 방식을 제공하며, 이 방식을 통해 supervisorctl 명령어를 사용하여 일련의 프로세스를 관리할 수 있습니다. [program:x]의 프로세스 그룹과 달리, 여기서의 프로세스는 각각의 [program:x]입니다.
[group:thegroupname]1programs=progname2 ,progname
; 각각 [program:x] 정의에서 'x'를 참조합니다999         priority= 999; 상대적 시작 우선순위 (기본)

)1 progname과2 추가된 이 설정 이후로는 progname1 의 프로세스 이름이 thegroupname:progname으로 변경됩니다2 이제 이 이름을 사용하여 프로세스를 관리해야 하며, 이전의 progname이나 thegroupname:progname을 사용하지 않습니다1.

이후 supervisorctl stop thegroupname:을 실행하면 동시에 progname을 종료할 수 있습니다1 progname과2supervisorctl stop thegroupname:progname을 실행하면1 progname을 종료할 수 있습니다1supervisorctl 명령어는 나중에 설명할 예정입니다.

supervisord 시작

supervisord 명령어를 실행하면 supervisord 프로세스가 시작되고, 설정 파일에 설정된 프로세스도 해당되어 시작됩니다.

# 기본 구성 파일을 사용합니다 /etc/supervisord.conf
supervisord
# 구성 파일을 명확히 지정합니다
supervisord -c /etc/supervisord.conf
# user 사용자로 supervisord를 시작합니다
supervisord -u user

더 많은 매개변수는 참조할 수 있습니다.문서

supervisorctl 명령어 소개

# 특정 프로세스를 중지합니다. program_name은 [program:x]에서의 x입니다
supervisorctl stop program_name
# 특정 프로세스를 시작합니다
supervisorctl start program_name
# 특정 프로세스를 재시작합니다
supervisorctl restart program_name
# groupworker라는 이름의 그룹에 속한 모든 프로세스를 종료합니다 (start, restart도 마찬가지로)
supervisorctl stop groupworker:
# groupworker:name를 종료합니다1 이 프로세스 (start, restart도 마찬가지로)
supervisorctl stop groupworker:name1
# 모든 프로세스를 중지합니다. 주의: start, restart, stop 모두 최신 구성 파일을 로드하지 않습니다.
supervisorctl stop all
# 최신 구성 파일을 로드하고 기존 프로세스를 중지한 후 새로운 구성에 따라 모든 프로세스를 시작하고 관리합니다.
supervisorctl reload
# 최신 구성 파일에 따라 새로운 구성이나 변경된 프로세스를 시작하거나 변경합니다. 구성이 변경되지 않은 프로세스는 영향을 받지 않고 재시작되지 않습니다.
supervisorctl update

주의: stop 명령으로 중지된 프로세스만 표시되며, reload 또는 update 명령으로 자동 재시작되지 않습니다. 또한 참조할 수 있습니다.여기서

시스템 시작 시 Supervisord 자동 시작

Supervisord는 기본적으로 서비스로 설치되지 않았으며, 그 자체도 프로세스입니다. 공식 사이트에서 Supervisord를 서비스로 설치할 수 있는 스크립트가 제공되었으며, 여기서 다양한 운영 체제의 설치 스크립트를 참조할 수 있습니다. 하지만 공식 사이트에서 제공하는 Ubuntu 스크립트는 실행되지 않습니다.

설치 방법은 참조할 수 있습니다. serverfault 의 답변.

예를 들어, 나는 Ubuntu 시스템이면 이렇게 설치할 수 있습니다. 여기서는 다른 스크립트를 선택했습니다.

# 下载脚本
sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"
# 이 스크립트를 실행할 수 있게 설정
sudo chmod +x /etc/init.d/supervisord
# 시스템 시작 시 자동으로 실행되도록 설정
sudo update-rc.d supervisord defaults
# 작동하는지 테스트해 보세요
service supervisord stop
service supervisord start

주의: 이 스크립트를 다운로드한 후, 우리의 설정과 일치하는지 확인해 보세요. 예를 들어, 기본 설정 파일 경로, pid 파일 경로 등이 다를 경우 일부 수정이 필요할 수 있습니다.

사실, 간단한 방법이 하나 더 있습니다. Linux가 시작할 때마다 실행되기 때문에 /etc/rc.local에 있는 스크립트에 추가되었기 때문에 여기에 실행 명령어를 추가하면 됩니다

# Ubuntu일 경우 다음 내용을 추가하세요
/usr/local/bin/supervisord -c /etc/supervisord.conf
# CentOS일 경우 다음 내용을 추가하세요
/usr/bin/supervisord -c /etc/supervisord.conf

위 내용은 exit 명령어 앞에 추가되어야 하며, rc.local 스크립트를 실행할 때 PATH 환경 변수가 전부 초기화되지 않았기 때문에 명령어는 절대 경로를 사용해야 합니다.

추가하기 전에, 터미널에서 명령어가 정상적으로 실행되는지 테스트해 보세요. supervisord를 찾을 수 없으면 다음 명령어를 사용할 수 있습니다.

sudo find / -name supervisord

언급: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원 저작자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용이 있으면, 이메일을 notice#w로 보내 주세요.3codebox.com에 이메일을 보내면, #을 @으로 변경하여 신고하시고 관련 증거를 제공해 주세요. 확인되면, 사이트는 즉시 위반 내용을 삭제합니다.

좋아하는 것