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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 时分秒毫秒_python将时分秒转换成秒的实例

处理数据的时候遇到一个问题,从数据库里导出的数据是时分秒的格式:hh:mm:ss ,现在我需要把它转换成秒,方便计算。原数据可能分两种情况,字段有可能是文本字符串类型的,也有可能是时间类型,他们的…

信息系统项目管理师论文优秀范文_软考 信息系统项目管理师备考指南

1.考试简介信息系统项目管理师考试作为全国计算机技术与软件专业技术资格(水平)考试(一般简称为“软考”)的一个高级级别,是从2005年开始的,一共考了2次,即2005年5月,200…

单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程

一、单片机驱动单个发光二极管1.电路代码:1.点亮单个LED二极管#include《reg51.h> sbit LED1P1^0&#xff1b;void main(void){LED11&#xff1b;while(1)&#xff1b;{LED10} }2.单个LED数码管以固定频率闪烁#include<reg51.h> sbit LED1P1^0;void Delay(unsigned in…

mysql人事管理系统源代码_人事管理系统(源代码.doc

人事管理系统(源代码附录&#xff1a;毕业设计程序清单设计题目 人事管理系统教 学 班&#xff1a;学生姓名&#xff1a;学 号&#xff1a;指导教师&#xff1a;完成日期&#xff1a;Option ExplicitDim Bupdata As BooleanDim i As IntegerPrivate Sub Cmbdegree_Click()If Cm…

python实时数据流_python – 使用烧瓶web-app监控实时数据流

这是基于https://stackoverflow.com/a/13388915/819544发布的答案我想监视一个数据流并将其推送到类似于上面答案的前端,但是一旦应用程序启动,流就开始生成/监视数据,并且客户端总是看到当前的状态数据流(无论是否从服务器请求数据,它都会继续运行).我很确定我需要通过线程将数…

macos系统自动安装mysql_macos系统安装mysql

MacOS系统安装mysql一、下载官网下载链接地址&#xff1a;https://dev.mysql.com/downloads/mysql/二、安装打开文件是pkg包&#xff0c;双击进行安装&#xff1a;按照提示&#xff1a;点击最下面的MySQL控制按钮&#xff0c;启动数据库运行&#xff1a;在此可以启动和停止MySQ…

水晶报表中对某一栏位值进行处理_合并报表——非同一控制下的企业合并amp;同一控制下的企业合并...

【写在前面】长期股权投资企业的一种投资行为&#xff0c;投资方通过该行为享有被投资单位的股利分配、净利润等投资收益&#xff0c;处理的是母公司&#xff08;投资方&#xff09;的个别财务报表。只有控股合并才需要编制合并报表&#xff0c;意味着后续计量采用的是成本法。…

mysql和springboot对照_SpringBoot(六) SpirngBoot与Mysql关系型数据库

pom.xml文件的配置org.springframework.bootspring-boot-starter-jdbcmysqlmysql-connector-javaruntime写配置文件spring.datasource.url jdbc:mysql://localhost:3306/spring?useUnicodetrue&characterEncodingutf-8spring.datasource.username rootspring.datasource…

python创建数据库计算机积极拒绝、无法连接_Python3 请求网页源码 目标计算机积极拒绝,无法连接...

代码&#xff1a;import urllibfrom urllib.request import urlopenfrom urllib.parse import urlencodeurlhttp://xxx.xxxx.com/ //测试链接resurlopen(url)#通过urlopen方法访问拼接好的urlresres.read().decode()#read()方法是读取返回数据内容&#xff0c;decode是转换返回…

python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...

引用自:http://blog.csdn.net/kaku21/article/details/42124593参考网址&#xff1a;http://programmaticallyspeaking.com/test-data-provider-using-python-metaclass.html使用TestNG进行测试的时候&#xff0c;允许使用外部数据源来驱动测试方法的执行&#xff0c;举个例子&…

python杨辉三角_yiduobo的每日leetcode 118.杨辉三角 amp;amp; 119.杨辉三角II

祖传的手艺不想丢了&#xff0c;所以按顺序写一个leetcode的题解。计划每日两题&#xff0c;争取不卡题吧。118.杨辉三角https://leetcode-cn.com/problems/pascals-triangle/119.杨辉三角IIhttps://leetcode-cn.com/problems/pascals-triangle-ii/经典的数学题。118题需要求出…

mysql 字段a减字段b_SQL 数据库 如何实现第一行字段A减字段B得到值C,然后再用C减去第二行字段B,以此类推,求高手解答...

select * ,0 as 缺货 into tmp_r from table_1 --创建结果表declare i intdeclare j intdeclare q intselect row_number() over(order by 子件S) as id,子件S,现存量 into #tmp_s from table_1 group by 子件S,现存量 --第一个临时表将子件S列出来set i 1while (i<(select …

python历史背景_python学习之旅1-1(python背景、安装介绍)

一、python介绍1.python历史背景python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间&#xff0c;吉多范罗苏姆(中文名字&#xff1a;龟叔)为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。1989年&…

mysql使用小技巧_mysql使用小技巧

1&#xff0e;mySql 删除表中大批量的数据假设有一个表(logs)有2000万条记录&#xff0c;我们要在业 务不停止的情况下删除其中status1的所有记录&#xff0c;差不多有1800万条&#xff0c;直接执行 DELETE FROM logs WHERE status1 会发现删除失败&#xff0c;因为lock wait t…

python并行计算_Python并行计算简单实现

multiprocessing包是Python中的多进程管理包.Pool(num)类提供一个进程池,然后在多个核中执行这些进程,其中默认参数num是当前机器CPU的核数.Pool.map(func, iterable[, chunksizeNone])2个参数, 第一个参数是函数, 第二个参数是需要可迭代的变量, 作为参数传递到func如果func含…

为什么链接不上mysql数据库_java链接不上数据库,怎么解决!

居正w去年刚好做过这个&#xff0c;给你贴下我的链接代码try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载sqlserver JDBC驱动程序 //Class.forName("org.gjt.mm.mysql.Driver"); System.out.pr…

python transform方法_Python transforms.BboxTransformFrom方法代码示例

# 需要导入模块: from matplotlib import transforms [as 别名]# 或者: from matplotlib.transforms import BboxTransformFrom [as 别名]def _set_lim_and_transforms(self):"""set the *dataLim* and *viewLim*:class:~matplotlib.transforms.Bbox attributes…

java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?

首先要说明一点&#xff0c;Java线程的实现是基于底层系统的线程机制来实现的,程序中开的线程并不全部取决于JVM虚拟机栈&#xff0c;而是取决于CPU&#xff0c;操作系统&#xff0c;其他进程&#xff0c;Java的版本。JVM的线程与计算机本身性能相关。以前写过一个例子&#xf…

世界上最难的视觉图_世界上最长的蛇有多长?四川惊现55米洪荒巨蟒(图)

蛇&#xff0c;一直是站在食物链顶端的致命生物&#xff0c;蟒蛇更是能够吞食人类的恐怖巨兽。网传世界上最长的蛇有500米之长&#xff0c;名为“红海巨蛇”&#xff0c;已被证实为虚假传言&#xff0c;以地球现在的环境是不可能出现如此之大的蛇的。据说四川发现了罕见的55米长…

解析器 java_java 常用的解析工具

这里介绍两种 java 解析工具。第一种&#xff1a;java 解析 html 工具 jsoup第二种&#xff1a; java 解析 XML 工具 Dom4jjsoupjsoup是一个用于处理真实HTML的Java库。它提供了一个非常方便的API&#xff0c;用于提取和操作数据&#xff0c;使用最好的DOM&#xff0c;CSS和类似…