做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 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进行进程监控以及自动启动相关推荐

  1. python实现网络监控_使用python进行服务器监控

    使用python进行服务器监控 Linux服务器中,一切皆为文件.也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到: Linux系统中,有一个/proc的虚拟文件系统 Linux 系统为管 ...

  2. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  3. python psutil 获取命令历史_Python使用psutil获取进程信息的例子

    psutil是什么 psutil是一个能够获取系统信息(包括进程.CPU.内存.磁盘.网络等)的Python模块.主要用来做系统监控,性能分析,进程管理,像glances也是基于psutil写成的. ...

  4. python做硬件自动化测试-用python做自动化测试--Python实现远程性能监控

    http://blog.csdn.net/powerccna/article/details/8044222 在性能测试中,监控被测试服务器的性能指标是个重要的工作,包括CPU/Memory/IO/N ...

  5. Python获取磁盘使用信息,python获取GPU信息,python根据进程号获取进程信息,pynvml 获取GPU信息,psutil 获取进程信息,系统信息等

    一.工具:psutil模块 psutil是一个跨平台模块,试用相应方法可以直接获取计算机CPU,内存,磁盘,网络等资源使用情况:可以使用我们学习知识与这模块用来做系统监控,性能分析:如果大家熟悉Lin ...

  6. python系统监控_使用Python监控Linux系统

    阅读目录 一.Python编写的监控工具 一.多功能系统资源统计工具dstat 1.dstat介绍 dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat. ...

  7. python做服务器监控_使用python进行服务器的监控

    在Linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的:百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统: Linux 系统为管理员提供 ...

  8. python网站开发linux_使用Python编写Linux系统守护进程实例

    守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.通常,守护进程没有任何存在的父进程(即PPID=1),且 ...

  9. Python开发【Part 11】:线程与进程

    本节内容 操作系统发展史 进程与线程 Python GIL全局解释器锁 Python线程 Python进程 一.操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中 ...

最新文章

  1. GRUB引导另一个主分区
  2. OpenCV视差图后过滤
  3. Linux网络编程 之 广播(五)
  4. laravel 5.1 添加第三方扩展库
  5. 谁再问你“天天爬那些数据有什么用”,就把这5本书扔给他!
  6. 笔记_深度学习相关_PyTorch
  7. 关于 java 上传,下载和导入报java.lang.IllegalStateException异常解决办法
  8. kml文件转成cvs_KMZ KML与SHP文件互相转换
  9. word多级标题的使用
  10. 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?
  11. 上古卷轴5json文件修改_《上古卷轴5》丝袜MOD制作图文教程 丝袜怎么制作
  12. PyTorch多进程子进程瘫痪,解决办法
  13. MOOS-ivp 实验三 MOOS简介(3)
  14. 【搬运工】值得一提的生活窍门
  15. Settings简介
  16. Java之Excel导出工具类使用教程
  17. sas数据的中国地图 湿地
  18. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp这些都是什么意思啊? [
  19. 抖音怎么剪切多余的音乐
  20. docker tag详解

热门文章

  1. sqlalchemy外键和relationship查询
  2. vim 插件之commentary
  3. 数据库基础知识——变量
  4. Leetcode--94. 二叉树的中序遍历(迭代递归)
  5. 中柏平板u盘启动_中柏电脑如何设置BIOS U盘启动
  6. python做excel表格柱状图_Python Excel 绘制柱形图
  7. u盘锁电脑_程序员用U盘偷公司源码被抓;Rust 语言发布 5 周年
  8. case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
  9. matplotlib设置多个图例横向水平放置
  10. 用PyMC3进行贝叶斯统计分析(代码+实例)