Supervisor是一个客户端/服务器系统,允许其用户在Linux/Unix操作系统上控制多个进程,如启动、停止、重启一个或多个进程。还能自动重启被杀死的进程,做到对重要进程的保护。
apt-get install supervisor
安装完成后运行以下命令生成官方配置模版:
echo_supervisord_conf > /etc/supervisord.conf
编辑supervisord.conf配置文件:
vim /etc/supervisord.conf
以下是配置文件模版:
;示例主管配置文件。
;
;有关配置文件的详细信息,请参阅:
;http://supervisord.org/configuration.html
;
;注:
;-不支持shell扩展(“~”或“$home”)。环境
;变量可以使用以下语法展开:“%(env_home)s”。
;-注释必须有一个前导空格:“A=B ;注释”不是“A=B;注释”。
[unix_http_server]
file=/tmp/supervisor.sock ;(socket文件的路径)
;chmod=0700 ;socket文件模式(默认为0700)
;chown=nobody:nogroup ;socket文件uid:gid owner
;username=user ;(默认值为无用户名(open server))
;password=123 ;(默认值为无密码(open server))。
;[inet_http_server] ;HTTP服务器,提供web管理界面,默认情况下禁用inet(TCP)服务器
;port=127.0.0.1:9001 ;(Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性)
;username=user ;(默认值为无用户名(open server))
;password=123 ;(默认值为无用户名(open server))。
[supervisord]
logfile=/tmp/supervisord.log ;(主日志文件;默认值$cwd/supervisord.log)
logfile_max bytes=50MB ;(最大主日志文件字节;默认50MB)
logfile_backups=10 ;(主日志文件备份数;默认值10)
loglevel=info ;(日志级别;默认信息;其他:debug,warn,trace)
pidfile=/tmp/supervisord.pid ;(supervisord pidfile;默认supervisord.pid)
nodaemon=false ;(如果为true,则从前台开始;默认为false)
minfds=1024 ;(最小可用启动文件描述符;默认值1024)
minprocs=200 ;(最小可用进程描述符;默认值200)
;umask=022 ;(进程文件创建umask;默认022)
;user=chrism ;(默认为当前用户,如果是根用户,则为必需)
;identifier=supervisor ;(supervisor identifier,默认为'supervisor')
;directory=/tmp ;(启动时默认不为cd)
;nocleanup=true ;(开始时不清理临时文件;默认为false)
;child log dir=/tmp ;('auto'子日志dir,默认$temp)
;environment=key=“value” ;(要添加到环境中的键值对)
;strip_ansi=false ;(在日志中删除ansi转义代码;默认false)
;下面的部分必须保留在rpc的配置文件中。
;(supervisorctl/web接口)要工作,附加接口可以是
;通过在单独的RPCField:Atdies中定义它们来添加。
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;使用UNIX://URL用于UNIX套接字
;serverurl=http://127.0.0.1:9001 ;使用HTTP://URL指定一个Inter套接字
;username=chris ;如果设置,则应与http_username相同
;password=123 ;如果设置,则应与http_password相同
;prompt=mysupervisor ;CMD行提示(默认“supervisor”)
;history_file=~/.sc_history ;如果可用,请使用读行历史记录
;包含其它配置文件
;[include]
;files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件
;下面的示例程序部分显示所有可能的程序子部分值,
;创建一个或多个“真实”程序:可以在
;supervisor。
;[program:theprogramname] ;要管理的经常配置参数,theprogramname是进程的名称
;command=/bin/cat ;程序(相对使用路径,程序启动命令)
;process_name=%(program_name)s ;process_name expr(默认%(program_name)s)
;numprocs=1 ;要启动的进程副本数(默认 1)
;directory=/tmp ;目录到cwd到exec之前的目录(默认 no cwd)
;umask=022 ;进程的umask(默认为无)
;priority=999 ;相对开始优先级(默认999)
;autostart=true ;supervisord 启动时也自动启动(默认值:true)
;startsecs=1 ;的secs prog必须保持运行状态(默认。1)
;startretries=3 ;启动时串行启动失败的最大值(默认值3)
;autorestart=unexpected ;如果在运行后退出,则何时重新启动(默认unexpected)
;exit codes=0,2 ;'expected'退出代码与autorestart一起使用(默认为0,2)
;stopsignal=quit ;用于终止进程的信号(默认术语)
;stopwaitsecs=10 ;等待b4 sigkill的最大秒数(默认值为10)
;stopasgroup=false ;向Unix进程组发送停止信号(默认为false)
;killasgroup=false ;sigkill unix进程组(默认false)
;user=chrism ;setuid到此unix帐户以运行程序
;redirect_stderr=true ;触发输出到stdout重定向(默认为false)
;stdout_logfile=/a/path ;stdout日志路径,无表示无;默认自动
;stdout_logfile_max bytes=1MB ;最大日志文件大小(默认为50MB)
;stdout_logfile_backups=10 ;stdout日志文件备份(默认为10)
;stdout_capture_maxbytes=1MB ;capturemode中的字节数(默认为0)
;stdout_events_enabled=false ;在stdout写入时发出事件(默认为false)
;stderr_logfile=/a/path ;stderr日志路径,无表示无;默认自动
;stdout_logfile_maxbytes=1MB ;最大日志文件字节(默认50MB)
;stdout_logfile_backups=10 ; #stdout日志文件备份数(默认值为10)
;stdout_capture_maxbytes=1MB ; “CaptureMode”中的字节数(默认为0)
;stdout_events_enabled=false ; 在stdout发出事件写了(默认false)
;stderr_logfile=/a/path ; stderr日志路径,无表示无;默认自动
;stderr_logfile_maxbytes=1MB ; 最大日志文件字节(默认50MB)
;stderr_logfile_backups=10 ;#stderr日志文件备份数(默认值为10)
;stderr_capture_maxbytes=1MB ; “CaptureMode”中的字节数(默认为0)
;stderr_events_enabled=false ; 写在标准错误或事件(默认为false)
;environment=A="1",B="2" ; 过程环境添加(默认无)
;serverurl=AUTO ; 覆盖服务器URL计算(childutils)
控制odoo进程,使进程意外死掉可以自动重启。
[program:odoo] ;要管理的经常配置参数,odoo是进程的名称
user=odoo
directory=/opt/odoo12
command=/opt/envs/odoo12/bin/python /opt/odoo12/odoo-bin -c /etc/odoo12.conf --logfile /var/log/odoo/odoo-server.log
autostart=true ;在supervisord启动的时候也自动启动
autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
stopwaitsecs=30 ;等待b4 sigkill的最大秒数(默认值为10)
stopsignal=KILL ;用于终止进程的信号(默认TERM)
;killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
;stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
stderr_logfile=/etc/supervisor/log.log
stdout_logfile=/etc/supervisor/log.log
先启动Supervisor:
supervisord -c /etc/supervisord.conf
查询Supervisor是否启动成功:
ps aux|grep supervisor
ps aux|grep odoo
supervisorctl 是 supervisord的命令行客户端工具:
supervisorctl status //查看所有进程的状态
supervisorctl stop odoo //停止odoo (odoo是进程名称,多个进程用","分隔)
supervisorctl start odoo //启动odoo
supervisorctl restart odoo //重启odoo
supervisorctl update //配置文件修改后可以使用该命令加载新的配置
supervisorctl reload //重新启动配置中的所有程序
supervisorctl stop all //停止所有进程
......
一
supervisor Error: Cannot open an HTTP server: socket.error reported errno.EADDRNOTAVAIL (99)
把http相关的模块删掉试试,如[inet_http_server]
;[inet_http_server] ;HTTP服务器,提供web管理界面,默认情况下禁用inet(TCP)服务器
;port=127.0.0.1:9001 ;(Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性)
;username=user ;(默认值为无用户名(open server))
;password=123 ;(默认值为无密码(open server))
二
error: , [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.py line: 228
启动Supervisor,或加sudo启动:
sudo supervisord -c /etc/supervisord.conf
如果Supervisor已启动就先kill掉他的进程再启动。
三
Unlinking stale socket /tmp/supervisor.sock
解决办法:
sudo unlink /tmp/supervisor.sock
四
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
重复启动了Supervisor,可以吧之前启动的Supervisor进程kill掉。