Supervisor是python2写就的一款强大的运维工具(其实现在已经支持Python3了 https://github.com/Supervisor/supervisor
那么怎么利用Supervisor监控python3程序呢?本文主要讲述Supervisor在CentOS下的安装部署。

1. 安装及设置

可通过pip3安装,如果你已经是python3的pip3,可以用一下命令安装

pip3 install git+https://github.com/Supervisor/supervisor    

如果是python2,可以用CentOS (系统自带Python2)的yum安装

sudo yum install supervisor

运行echo_supervisord_conf > /etc/supervisor/supervisord.conf来产生设置,未避免产生非root用户的权限错误,将/etc/supervisor/supervisord.conf[unix_http_server]这项改为 (修改chmod):

[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
chmod=0766 ; socket file mode (default )
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password= ; (default is no password (open server))

再将末尾的[include]部分改为:

[include]
files = /etc/supervisor/*.conf ;如果后面启动出错,“说已经include path了”,把这行删掉
files = /etc/supervisor/conf.d/*.conf

这样方便为每个app单独设置conf文件而不必全部写在全局设置里面。
在启动supervisorctl须先启动supervisord,否则会出现error: <class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python/socket.py line: 575错误:

sudo supervisord -c /etc/supervisor/supervisord.conf  (先启动supervisord)
sudo supervisorctl -c /etc/supervisor/supervisord.conf

如果 supervisord 出错:

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.
For help, use /bin/supervisord -h

找到和关闭supervisord process

ps -ef | grep supervisord

You will get some pid of supervisord just like these:

root    : pts/ :: grep --color=auto supervisord
root : ? :: /usr/bin/python /usr/local/bin/supervisord

if you get output like that, your pid is the second one. then if you want to shut down your supervisord you can do this

kill -s SIGTERM 

hope it helpful. ref: http://supervisord.org/running.html#signals

2. 几个例子

example 1:

[program:awesome]
environment=PYTHONPATH='/home/username/.local/lib/python3.6/site-packages/' ;这行非常重要,后面运行的时候,如果出错,说找不到package, 需要在这里指定package的path
command = /usr/bin/python3 /srv/awesome/www/app.py
directory = /srv/awesome/www
user = yshi2
startsecs = redirect_stderr = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups =
stdout_logfile = /srv/awesome/log/app.log

example 2:

[program:app]
directory = ~/su/ ; 程序的启动目录
command = /home/hadoop/anaconda3/bin/python /home/hadoop/su/app.py ; 启动命令,可以看出与手动在命令行启动的命令是一样的,注意这里home不可用~代替
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = ; 启动 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = ; 启动失败自动重试次数,默认是
user = hadoop ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/app.log

再介绍两个有用的配置项stopasgroupkillasgroup,如果我们用Flask等Rest服务,通常其会开启几个进程,那么如果stopasgroup不启用的话,supervisor无法重启此服务(关闭主进程时其子进程没有关闭,再开启主进程时会提示端口被占用等错误信息)。

; 默认为 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)

这里我们可以看出,虽然supervisor是python2写的,但只要我们指定运行的python3解释器去运行程序就行了。

运行supervisorctl,即可在shell里面方便的操作,如start apprestart app等。

若需要web界面,可在/etc/supervisor/supervisord.conf内修改,

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1: ; (ip_address:port specifier, *:port for all iface, 若的形式*:port则开放外网访问 )
;username=user ; (default is no username (open server))
;password= ; (default is no password (open server))

重启supervisorctl后即可在127.0.0.1:9001见到web界面,

3. 注意事项

  • 如果修改了 /etc/supervisord.conf ,需要执行 supervisorctl reload 来重新加载配置文件,否则不会生效。。。
  • 很多时候用supervisor管理后台进程容易失败,如hbase/bin/hbase-daemon.sh start thrift,这时候可以改用前台进程如/usr/local/hbase/bin/hbase thrift start
  • 可以让supervisord service 随机启动
systemctl enable supervisord
systemctl restart supervisord

使用supervisor支持Python3程序 (解决找不到Module的问题)的更多相关文章

  1. win7 创建vhd提示“找不到指定文件的虚拟磁盘支持提供程序”解决方法

    本文参照:https://itbbs.pconline.com.cn/diy/16509116_2.html 14楼中"坚持不放弃"用户的答案得到解决 问题复现: 1.window ...

  2. 在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法。

    在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法. 先确定 libclntsh.so.11.1 所在目录: [oracle@localhost ~] ...

  3. ubuntu将python3设为默认后再安装支持python3.x的包

    简介: ubuntu默认python2.7版本,如果想要装python3.x版本,请记住python2.7版本一定不能卸载!!!但是即使我 python3.x版本安装成功,当运行python脚本时,系 ...

  4. 未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序解决办法

    错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序. 解决办法: 去http://download.microsoft.com/download/7/0/3/7 ...

  5. 阅读DSSS.py 并修改成支持python3.6

    项目地址:https://github.com/stamparm/DSSS 功能:一款小型注入工具 代码如下URL:https://github.com/stamparm/DSSS/blob/mast ...

  6. 学以致用八---centos7.2 安装vim8+支持python3

    目的:打造基于python的vim环境 也是在地铁上突然产生的一个想法,平时都是在pycharm上练习python,但有时候会提示激活码过期,又得上网找激活码,够折腾的.那何不在linux环境下来搭建 ...

  7. IDEA maven 多项目 出现 java 程序包找不到

    使用idea 多项目引入的时候,出现报错信息:Error java程序包找不到 解决办法: 我在引入多个项目的时候,他们是在一个目录里面的.我把整个目录引入了进去.结果报依赖包找不到. 把引入的全部项 ...

  8. jenkins结合supervisor进行python程序发布后的自动重启

    jenkins结合supervisor进行python程序发布后的自动重启 项目背景: 通过jenkins发布kvaccount.chinasoft.com站点的python服务端程序,业务部门同事需 ...

  9. mac中matplotlib不支持中文的解决办法

    参考:https://blog.csdn.net/kaizei_pao/article/details/80795377 首先查看matplotlib已加载的字体: import matplotlib ...

随机推荐

  1. 开启idea自动Build功能

    修改Intellij IDEA的配置两步:1.setting -> Compile -> Build project automatically --> 选中 2.CTRL + SH ...

  2. stm32的hal之串口库函数总结复习

    1.串口的使用方法 在hal库中,有三个串口发送的函数 a.HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uin ...

  3. 依赖注入(DI)和控制反转(IOC)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  4. JS数组去重整理合集

    1.利用splice var arr = [1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1]; function repeat(arr){ for(var i = 0;i< ...

  5. 转发标签forward

    当执行到<jsp:forward page="相对路径"></jsp:forward>后,会立即结束当前页面的显示,跳转到另一个页面(JSP.HTML.Se ...

  6. make 的使用参数

  7. [系统]win10远程桌面其他电脑出现如下错误,由于数据加密错误,这个会话讲结束,请重新连接到远程计算机

    win10远程桌面其他电脑出现如下错误,由于数据加密错误,这个会话讲结束,请重新连接到远程计算机 这可能是由于credssp加密oracle修正的错误 HKEY_LOCAL_MACHINE\SOFTW ...

  8. 《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系

        新手入门:C/C++中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指 ...

  9. Three.js中的group,obj,模型中layers层级与相机

    目录 Three.js中的group,obj,模型中layers层级与相机 layers group中的.layers.mask设置 一些设想 Three.js中的group,obj,模型中layer ...

  10. 乌龙茶生产过程中挥发性成分吲哚的形成 | Formation of Volatile Tea Constituent Indole During the Oolong Tea Manufacturing Process

    吲哚是啥?在茶叶成分中的地位?乌龙茶?香气,重要的前体,比如色氨酸Trp.IAA. Indole is a characteristic volatile constituent in oolong ...