python进程监控 supervisor_使用Python的Supervisor进行进程监控以及自动启动
做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下。
结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的。同时也会讲下小团队又该怎么敏捷的解决。
下面按照监控的方法依次介绍。
一、按照进程名监控
在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在。
这种方法是比较简单的方法,但是考虑到很多进程会在启动之后改名,以及进程名存在各种特殊字符,多个进程同时存在的问题,实际操作起来并不是很舒服。
举个简单的例子,gunicorn启动之后的进程名类似这样 master: [wsgi:app],其中的方括号在grep时要记得转义,否则就会出问题。
不过不管怎么说,这种方法在很多其他方式用不了的时候反而是最简单的方法。
下面是用python的实现:
def monitor_process(key_word, cmd):
p1 = subprocess.Popen(['ps', '-ef'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', key_word], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(['grep', '-v', 'grep'], stdin=p2.stdout, stdout=subprocess.PIPE)
lines = p3.stdout.readlines()
if len(lines) > 0:
return
sys.stderr.write('process[%s] is lost, run [%s]\n' % (key_word, cmd))
subprocess.call(cmd, shell=True)
二、按照端口监控
这种方式之前在腾讯打包的时候也有用,但是可能是进程名更直观的原因吧,貌似一直没怎么用起来。
不过现在自己在做包部署的时候,反而觉得端口监控是个最靠谱的事情了。这个也没什么好多说的,直接上刚写完的python代码:
def monitor_port(protocol, port, cmd):
address = ('127.0.0.1', port)
socket_type = socket.SOCK_STREAM if protocol == 'tcp' else socket.SOCK_DGRAM
client = socket.socket(socket.AF_INET, socket_type)
try:
client.bind(address)
except Exception, e:
pass
else:
sys.stderr.write('port[%s-%s] is lost, run [%s]\n' % (protocol, port, cmd))
subprocess.call(cmd, shell=True)
finally:
client.close()
有的朋友可能说对于tcp端口检查,其实以client的方式来connect()看是否成功会不会更好?其实我觉得这种方式也挺好的,并且对于不同的协议可以再深入处理一下,比如对http协议可以用urllib2.urlopen确保返回正确的包才算正常。不过如果这么做的话,就有点偏黑盒监控 了,比如监控宝、阿里云监控之类的服务了。
三、通过监控server启动进程,并以监控子进程的方式监控
这个也是在gunicorn页面上看到的,说起来gunicorn很不厚道的把gaffer放到第一个,让我还以为是个很成熟的产品,结果发现连启动都是个问题。
相反排在后面的supervisor反而相当的好用,下面是截图:
supervisor可以很方便的管理进程,包括重启,停止等等,而且提供了web界面和用户验证,可以很方便的在线管理。
但是有好处就有坏处,用了supervisor之后,就不能自己随便的去自己重启服务了,否则会影响supervisor的监控,这对我这种喜欢自己执行 xx.sh restart 的人实在有点太痛苦了。当然,其实要是习惯了去supervisorctl 里面start/stop/reload 之后也就还好了。
用supervisor配置gunicorn的配置项如下:
[program:yuanzhaopin]
environment=PYTHON_EGG_CACHE=/tmp/.python-eggs/,PYTHONPATH=/data/release/yuanzhaopin
command=/usr/local/bin/gunicorn --debug --log-level debug --log-file /tmp/g.log wsgi:app
user=zny2008
autorestart=true
redirect_stderr=true
ok,目前自己常用的就是这几种模式了,大家如果有其他选择欢迎留言讨论。
完整代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#*/1 * * * * python /xxx/monitor.py >> /xxx/logs/monitor.log 2>&1 &
import sys
import subprocess
import os.path as op
import socket
def this_abs_path(script_name):
return op.abspath(op.join(op.dirname(__file__), script_name))
def monitor_process(key_word, cmd):
p1 = subprocess.Popen(['ps', '-ef'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', key_word], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(['grep', '-v', 'grep'], stdin=p2.stdout, stdout=subprocess.PIPE)
lines = p3.stdout.readlines()
if len(lines) > 0:
return
sys.stderr.write('process[%s] is lost, run [%s]\n' % (key_word, cmd))
subprocess.call(cmd, shell=True)
def monitor_port(protocol, port, cmd):
address = ('127.0.0.1', port)
socket_type = socket.SOCK_STREAM if protocol == 'tcp' else socket.SOCK_DGRAM
client = socket.socket(socket.AF_INET, socket_type)
try:
client.bind(address)
except Exception, e:
pass
else:
sys.stderr.write('port[%s-%s] is lost, run [%s]\n' % (protocol, port, cmd))
subprocess.call(cmd, shell=True)
finally:
client.close()
#=============================================================================
def yuanzhaopin():
cmd = '%s start' % this_abs_path('gun.sh')
#monitor_process('\[yuanzhaopin\]', cmd)
monitor_port('tcp', 8635, cmd)
def main():
yuanzhaopin()
if __name__ == '__main__':
main()
python进程监控 supervisor_使用Python的Supervisor进行进程监控以及自动启动相关推荐
- python实现网络监控_使用python进行服务器监控
使用python进行服务器监控 Linux服务器中,一切皆为文件.也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到: Linux系统中,有一个/proc的虚拟文件系统 Linux 系统为管 ...
- Python实例浅谈之五Python守护进程和脚本单例运行
一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...
- python psutil 获取命令历史_Python使用psutil获取进程信息的例子
psutil是什么 psutil是一个能够获取系统信息(包括进程.CPU.内存.磁盘.网络等)的Python模块.主要用来做系统监控,性能分析,进程管理,像glances也是基于psutil写成的. ...
- python做硬件自动化测试-用python做自动化测试--Python实现远程性能监控
http://blog.csdn.net/powerccna/article/details/8044222 在性能测试中,监控被测试服务器的性能指标是个重要的工作,包括CPU/Memory/IO/N ...
- Python获取磁盘使用信息,python获取GPU信息,python根据进程号获取进程信息,pynvml 获取GPU信息,psutil 获取进程信息,系统信息等
一.工具:psutil模块 psutil是一个跨平台模块,试用相应方法可以直接获取计算机CPU,内存,磁盘,网络等资源使用情况:可以使用我们学习知识与这模块用来做系统监控,性能分析:如果大家熟悉Lin ...
- python系统监控_使用Python监控Linux系统
阅读目录 一.Python编写的监控工具 一.多功能系统资源统计工具dstat 1.dstat介绍 dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat. ...
- python做服务器监控_使用python进行服务器的监控
在Linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的:百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统: Linux 系统为管理员提供 ...
- python网站开发linux_使用Python编写Linux系统守护进程实例
守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.通常,守护进程没有任何存在的父进程(即PPID=1),且 ...
- Python开发【Part 11】:线程与进程
本节内容 操作系统发展史 进程与线程 Python GIL全局解释器锁 Python线程 Python进程 一.操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中 ...
最新文章
- GRUB引导另一个主分区
- OpenCV视差图后过滤
- Linux网络编程 之 广播(五)
- laravel 5.1 添加第三方扩展库
- 谁再问你“天天爬那些数据有什么用”,就把这5本书扔给他!
- 笔记_深度学习相关_PyTorch
- 关于 java 上传,下载和导入报java.lang.IllegalStateException异常解决办法
- kml文件转成cvs_KMZ KML与SHP文件互相转换
- word多级标题的使用
- 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?
- 上古卷轴5json文件修改_《上古卷轴5》丝袜MOD制作图文教程 丝袜怎么制作
- PyTorch多进程子进程瘫痪,解决办法
- MOOS-ivp 实验三 MOOS简介(3)
- 【搬运工】值得一提的生活窍门
- Settings简介
- Java之Excel导出工具类使用教程
- sas数据的中国地图 湿地
- 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp这些都是什么意思啊? [
- 抖音怎么剪切多余的音乐
- docker tag详解
热门文章
- sqlalchemy外键和relationship查询
- vim 插件之commentary
- 数据库基础知识——变量
- Leetcode--94. 二叉树的中序遍历(迭代递归)
- 中柏平板u盘启动_中柏电脑如何设置BIOS U盘启动
- python做excel表格柱状图_Python Excel 绘制柱形图
- u盘锁电脑_程序员用U盘偷公司源码被抓;Rust 语言发布 5 周年
- case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
- matplotlib设置多个图例横向水平放置
- 用PyMC3进行贝叶斯统计分析(代码+实例)