1. Что такое супервайзер
Supervisor — это инструмент мониторинга процессов в системах Linux/Unix.Supervisor — это общая программа управления процессами, разработанная Python.Он может управлять процессами и отслеживать их в Linux.Он может превращать обычный процесс командной строки в фоновый демон и контролировать процесс.status , он может автоматически перезапуститься при аварийном выходе. Однако, как и daemontools, он не может отслеживать процессы демона.
supervisorОфициальный сайт нажмите здесь.
2. Зачем использовать супервайзер
- Простой в использовании Supervisor предоставляет единый способ запуска, остановки и мониторинга ваших процессов Процессами можно управлять индивидуально или группами. Вы можете настроить Supervisor локально или удаленно из командной строки или веб-интерфейса. Многие программы под linux обычно работают постоянно, вообще говоря, вам нужно написать скрипт, который может реализовать функцию запуска/остановки/перезапуска/перезагрузки процесса, а затем поместить его в /etc/init.d/. Но есть и много минусов в этом пути.Во-первых,надо писать одинаковый скрипт для каждой программы.Во-вторых,когда процесс зависает,линукс не перезапустит его автоматически.Если мы хотим перезапускаться автоматически,мы должны его написать Сценарий перезапуска мониторинга. Супервайзер прекрасно может решить эти проблемы. Процесс управления супервизором должен запускать эти управляемые процессы как дочерние процессы супервизора через fork/exec. В этом случае нам нужно только прописать путь к исполняемому файлу управляемого процесса в конфигурационном файле супервизора и все будет в порядке. Во-вторых, управляемый процесс является дочерним процессом супервизора.Когда дочерний процесс зависает, родительский процесс может точно получить информацию о зависании дочернего процесса, поэтому, конечно, он может автоматически перезапустить зависший дочерний процесс.Конечно, перезапустить Все еще не перезагружается, это также зависит от того, есть ли autostart=true в вашем файле конфигурации. Supervisor настраивается с помощью файла конфигурации в формате INI, который легко освоить.Он предоставляет множество параметров конфигурации для каждого процесса, что может упростить перезапуск процесса или автоматическую ротацию журнала.
- Централизованное управление Процесс, управляемый супервизором, и информация о группе процессов записываются в файл формата ini, и все в порядке. Более того, когда мы управляем супервизором, мы можем управлять им локально или удаленно, а супервизор предоставляет веб-интерфейс, на котором мы можем отслеживать процессы и управлять ими. Конечно, для локального, удаленного и веб-управления нужно вызывать интерфейс супервизора xml_rpc, а это отдельная история. Супервизор может управлять группой процессов единообразно, то есть мы можем записать процессы, которыми необходимо управлять, в группу, а затем управлять этой группой как объектом, например запускать, останавливать, перезапускать и так далее. В системе Linux нет этой функции.Если мы хотим остановить процесс, мы можем остановить его только один за другим, или мы можем написать сценарий, чтобы остановить его в пакетном режиме.
3. компонент супервайзера
- надзиратель Главный процесс — это сервер, отвечающий за управление процессом, он создаст указанное количество подпроцессов приложения согласно конфигурационному файлу, будет управлять всем жизненным циклом подпроцесса, перезапустит сбойный процесс и отправит событие уведомления об изменении процесса. В то же время встроенный веб-сервер и интерфейс XML-RPC позволяют легко осуществлять управление процессами. . Файл конфигурации для этой службы — /etc/supervisor/supervisord.conf.
- supervisorctl Инструмент командной строки на стороне клиента, который предоставляет интерфейс, похожий на оболочку, через который вы можете подключаться к различным процессам супервизора для управления соответствующими подпрограммами, а команды взаимодействуют со службами через сокеты UNIX или TCP. Пользователи могут отправлять сообщения в supervisord через командную строку для просмотра состояния процесса, загрузки файлов конфигурации, запуска и остановки процессов, просмотра стандартного вывода процесса и вывода ошибок, а также выполнения удаленных операций. Сервер также может потребовать от клиента предоставить аутентификацию перед продолжением.
- Веб сервер Супервизор предоставляет функцию веб-сервера, который может контролировать процесс через Интернет (необходимо установить [inethttpсервер] элемент конфигурации).
- XML-RPC-интерфейс Интерфейс XML-RPC, подобно тому, как HTTP предоставляет веб-интерфейс пользователя, используется для управления супервизором и программами, запускаемыми им.
4. Установка, настройка, использование
Supervisor написан на python и может быть установлен с помощью easy_install и pip.Например, под моей машиной Centos команда установки выглядит следующим образом:
yum install python-setuptools
easy_install pip
pip install superviso
在这里我使用pip安装之后,在创建配置文件的时候出错,所以我又选择了使用easy_install supervisor的安装方法
当然也可以下载源码进行安装,比如:
wget кожа.Python.org/packages/so… --no-check-certificat
tar -zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
sudo python setup.py install
После установки вы можете напрямую запустить supervisord, чтобы проверить, успешно ли она выполнена. Если сообщается об ошибке, устраните ее одну за другой. Например, может быть сообщено о проблеме с версией meld3. Вот шаги установки:
wget http://effbot.org/media/downloads/elementtree-1.2.7-20070827-preview.zip
unzip elementtree-1.2.7-20070827-preview.zip && cd elementtree-1.2.7-20070827-preview
python setup.py install
Или скачать эту версию:
wget http://www.plope.com/software/meld3/meld3-0.6.5.tar.gz
tar -xf meld3-0.6.5.tar.gz && cd meld3-0.6.5
python setup.py install
Если установка прошла успешно, можно переходить к следующему шагу: настройке конфигурационного файла.
### 生成配置文件,且放在/etc目录下
echo_supervisord_conf > /etc/supervisord.conf
###为了不将所有新增配置信息全写在一个配置文件里,这里新建一个文件夹,每个程序设置一个配置文件,相互隔离
mkdir /etc/supervisord.d/
### 修改配置文件
vim /etc/supervisord.conf
### 加入以下配置信息
[include]
files = /etc/supervisord.d/*.conf
### 在supervisord.conf中设置通过web可以查看管理的进程,加入以下代码(默认即有,取消注释即可)
[inet_http_server]
port=9001
username=user
password=123
начать супервизор
# supervisord -c /etc/supervisord.conf
Проверьте, слушаете ли вы
# lsof -i:9001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 14685 root 4u IPv4 20155719 0t0 TCP *:etlservicemgr (LISTEN)
теперь черезhttp://ip:9001/Вы можете просматривать веб-интерфейс супервайзера (логин и пароль по умолчанию - user и 123).Конечно, программа мониторинга еще не добавлена.
Давайте напишем простой скрипт на Python, чтобы проверить эффект мониторинга супервизора.
#cat /root/temp/test_http.py ###以下即是test_http.py脚本中的代码
#!/usr/bin/env python
# coding=utf-8
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
if __name__ == "__main__":
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 10000
server_address = ('0.0.0.0', port)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
Добавьте файл конфигурации, чтобы супервизор мог отслеживать программу test_http.py.
#cat /etc/supervisord.d/supervisor_test_http.conf ### 以下即为配置文件中的内容
[program:test_http]
command=python /root/temp/test_http.py 9999 ; 被监控的进程路径
directory=/root/temp ; 执行前要不要先cd到目录去,一般不用
priority=1 ;数字越高,优先级越高
numprocs=1 ; 启动几个进程
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启。。当然要选上了
startretries=10 ; 启动失败时的最多重试次数
exitcodes=0 ; 正常退出代码(是说退出代码是这个时就不再重启了吗?待确定)
stopsignal=KILL ; 用来杀死进程的信号
stopwaitsecs=10 ; 发送SIGKILL前的等待时间
redirect_stderr=true ; 重定向stderr到stdout
Перезапустите супервизор или перезагрузите файл конфигурации:
supervisorctl reload
### 或者
supervisorctl -c /etc/supervisord.conf
В этот момент, если вы снова посетите http-страницу, вы обнаружите, что программа test_http.py была отслежена и запущена автоматически.
На этом этапе вы также можете получить доступ к службе http, предоставляемой программой test_http.py, например http://ip:9999.
Примечание: Супервизор может только контролировать программы переднего плана.Если ваша программа является сервисом-демоном, реализованным fork, вы не можете использовать его для мониторинга, в противном случае супервизор>статус выведет запрос: BACKOFF Слишком быстрый выход (в журнале процессов могут быть подробности).Поэтому такие сервисы, как apache и tomcat, по умолчанию запускаются в режиме демона. Вы не можете напрямую запустить сценарий запуска (запуск службы httpd) через супервизор. запуск tomcat под супервизором.Пожалуйста, обратитесь к сценарию остановки:Controlling tomcat with supervisorилиsupervisor-tomcat.conf.
Кроме того, вы можете запустить супервизор при старте системы, а Linux будет выполнять скрипт в /etc/rc.local при его запуске, так что просто добавьте сюда команду выполнения:
# 如果是 Ubuntu 添加以下内容(这里要写全路径,因为此时PATH的环境变量未必设置)
/usr/local/bin/supervisord -c /etc/supervisord.conf
# 如果是 Centos 添加以下内容
/usr/bin/supervisord -c /etc/supervisord.conf
6. Супервайзерское управление
Управлением супервизором можно управлять с помощью инструмента командной строки (supervisorctl) или веб-интерфейса.Если вы шаг за шагом выполняете описанные выше шаги, то веб-управление можно использовать в обычном режиме.Вот отдельное введение в командный инструмент supervisorctl:
### 查看supervisorctl支持的命令
# supervisorctl help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
### 查看当前运行的进程列表
# supervisorctl status
test_http RUNNING pid 28087, uptime 0:05:17
в
- обновить обновить новую конфигурацию до supervisord (не будет перезапускать исходную запущенную программу)
- перезагрузить, загрузить все файлы конфигурации и запустить все процессы и управлять ими в соответствии с новой конфигурацией (перезапустить исходно запущенные программы)
- start xxx: запустить процесс
- перезапустить xxx: перезапустить процесс
- stop xxx: остановить процесс (xxx), xxx — это значение, настроенное в [program:theprogramname]
- остановить групповой работник: перезапустить все процессы, принадлежащие группе с именем groupworker (то же самое для запуска, перезапустить)
- остановить все, остановить все процессы, примечание: запуск, перезагрузка, остановка не загрузит последний файл конфигурации
- перечитайте, когда служба меняется с автоматического запуска на ручной запуск, ее можно выполнить
Примечание. Если исходную программу необходимо запустить с параметрами, следует сначала написать сценарий оболочки при запуске с supervisorctl, а затем запустить сценарий с помощью supervisorctl.
7. Введение в параметры конфигурации супервизора
Файл конфигурации супервизора в основном состоит из нескольких разделов конфигурации, а элементы конфигурации представлены в формате K/V.
- unixhttpблок конфигурации сервера
Элемент параметра в этом блоке конфигурации представляет HTTP-сервер, прослушивающий сокет, если [unixhttpserver] отсутствует в конфигурационном файле или закомментирован, HTTP-сервер на основе сокетов не будет запущен. Параметры этого блока описываются следующим образом:
- file:一个unix domain socket的文件路径,HTTP/XML-RPC会监听在这上面
- chmod:在启动时修改unix domain socket的mode
- chown:修改socket文件的属主
- username:HTTP server在认证时的用户名
- password:认证密码
- inethttpблок конфигурации сервера
Элемент параметра в этом блоке конфигурации представляет HTTP-сервер, прослушивающий TCP, если [inethttpserver] отсутствует в конфигурационном файле или закомментирован, HTTP-сервер на основе TCP не будет запущен. Параметры этого блока описываются следующим образом:
- port:TCP监听的地址和端口(ip:port),这个地址会被HTTP/XML-RPC监听
- username:HTTP server在认证时的用户名
- password:认证密码
Например:
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
Указывает, что монитор подключен к порту 9001, и для доступа необходимо использовать имя пользователя и пароль.Адрес доступа: http//127.0.0.1:9001.
- блок конфигурации супервизора
Элементы параметров этого блока конфигурации являются глобальными элементами конфигурации процесса супервизора. Параметры этого блока описываются следующим образом:
- logfile:log文件路径
- logfile_maxbytes:log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
- logfile_backups:轮转日志备份的数量,默认是10,如果设置为0,则不备份
- loglevel:error、warn、info、debug、trace、blather、critical
- pidfile:pid文件路径
- umask:umask值,默认022
- nodaemon:如果设置为true,则supervisord在前台启动,而不是以守护进程启动
- minfds:supervisord在成功启动前可用的最小文件描述符数量,默认1024
- minprocs:supervisord在成功启动前可用的最小进程描述符数量,默认200
- nocleanup:防止supervisord在启动的时候清除已经存在的子进程日志文件
- childlogdir:自动启动的子进程的日志目录
- user:supervisord的运行用户
- directory:supervisord以守护进程运行的时候切换到这个目录
- strip_ansi:消除子进程日志文件中的转义序列
- environment:一个k/v对的list列表
Параметры этого блока обычно можно использовать без изменений, и, конечно же, их можно изменить по мере необходимости.
- блок конфигурации программы
Этот блок является элементом конфигурации программы, которую мы хотим отслеживать. Заголовок блока конфигурации имеет фиксированный формат: ключевое слово программа, за которым следует двоеточие, за которым следует имя программы. Например: [program:foo], foo — это имя программы.При использовании supervisorctl для работы с программой оно помечается как foo. Параметры этого блока описываются следующим образом:
- command:启动程序使用的命令,可以是绝对路径或者相对路径
- process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s
- numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
- numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值
- priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999
- autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。
- autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。
- startsecs:程序启动后等待多长时间后才认为程序启动成功
- startretries:supervisord尝试启动一个程序时尝试的次数。默认是3
- exitcodes:一个预期的退出返回码,默认是0,2。
- stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
- stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间
- stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组
- killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。
- user:如果supervisord以root运行,则会使用这个设置用户启动子程序
- redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。
- stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。
- stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
- stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份
- stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
- stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
- stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true
- stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
- stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份
- stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
- stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
- environment:一个k/v对的list列表
- directory:supervisord在生成子进程的时候会切换到该目录
- umask:设置进程的umask
- serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
Например, следующий блок опций означает мониторинг программы с именем test_http:
[program:test_http]
command=python test_http.py 10000 ; 被监控的进程启动命令
directory=/root/ ; 执行前要不要先cd到目录去,一般不用
priority=1 ;数字越高,优先级越高
numprocs=1 ; 启动几个进程
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启。。当然要选上了
startretries=10 ; 启动失败时的最多重试次数
exitcodes=0 ; 正常退出代码(是说退出代码是这个时就不再重启了吗?待确定)
stopsignal=KILL ; 用来杀死进程的信号
stopwaitsecs=10 ; 发送SIGKILL前的等待时间
redirect_stderr=true ; 重定向stderr到stdout
8. Управление кластером
Супервизор не поддерживает мониторинг процессов на разных машинах. Супервизор может отслеживать программы только на локальном компьютере, что сильно ограничивает использование супервизоров.
Однако, поскольку сам супервизор поддерживает xml-rpc, существуют также некоторые инструменты управления многомашинными процессами, основанные на вторичной разработке супервизора. Например:
- Django-Dashvisor Web-based dashboard written in Python. Requires Django 1.3 or 1.4.
- Nodervisor Web-based dashboard written in Node.js.
- Supervisord-Monitor Web-based dashboard written in PHP.
- SupervisorUI Another Web-based dashboard written in PHP.
- cesi cesi is a web interface provides manage supervizors from same interface.
Там так много вышеперечисленных, я не знаю, очень хлопотно пробовать по одному, не могу разобраться, кроме последнегоcesi, К счастью, я немного знаю python, и установка неохотно прошла успешно.
Конкретные инструкции по установке cesi см. непосредственно в оригинальном файле Readme. Просто небольшое пояснение здесь:
git clone https://github.com/Gamegos/cesi
cd cesi && mkdir pack
python setup.py build
python setup.py install
sqlite3 /自己的路径path/userinfo.db < userinfo.sql
cp cesi.conf /etc/cesi.conf ### 自行修改cesi.conf内容,kv对,很简单
cd cesi && python web.py ### 即可启动成功
Настройки конфигурационного файла cesi.conf:
[node:local] ### 设置监控的各个机器
username = user
password = 123
host = 192.168.14.8
port = 9001
;[node:<node_name2>] ### 如果有多台机器,就依次添加
;username = <username>
;password = <password>
;host = <hostname>
;port = <port>
;[environment:<environment_name>]
;members = <node_name>, <node_name2>
[cesi]
database = /root/temp/cesi/userinfo.db ### 设置db路径
activity_log = /root/temp/cesi/cesi.log ### 设置log路径
host = 0.0.0.0
Если все пойдет хорошо, вы можете пройти через страницу http://ip:5000, логин и пароль оба admin, и окончательный эффект будет следующим:
Пример эффекта на cesi repo:
Запишите использование и научиться использовать его.