`

进程监控

阅读更多

做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下。

结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的。同时也会讲下小团队又该怎么敏捷的解决。

下面按照监控的方法依次介绍。

一、按照进程名监控

在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在。

这种方法是比较简单的方法,但是考虑到很多进程会在启动之后改名,以及进程名存在各种特殊字符,多个进程同时存在的问题,实际操作起来并不是很舒服。

举个简单的例子,gunicorn启动之后的进程名类似这样 master: [wsgi:app],其中的方括号在grep时要记得转义,否则就会出问题。

不过不管怎么说,这种方法在很多其他方式用不了的时候反而是最简单的方法。

下面是用python的实现:

下面是用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()

分享到:
评论

相关推荐

    shell脚本实现服务器进程监控的方法

    ### Shell 脚本实现服务器进程监控方法详解 在IT运维和开发环境中,服务器进程的稳定运行至关重要。本文将深入探讨如何使用Shell脚本实现服务器进程监控,这不仅有助于及时发现异常情况,还能提高系统的可用性和...

    c# winform实现进程监控

    在C# WinForm环境中开发进程监控程序是一项常见的任务,它涉及到对系统进程的实时跟踪、控制和管理。本文将深入探讨如何使用C#语言和Windows Forms(WinForm)框架来实现这一功能,以及如何设计一个能够按设定顺序...

    服务器进程监控源码

    《服务器进程监控源码解析与应用》 在IT运维领域,服务器进程监控是不可或缺的一环。本文将深入探讨一款基于MFC/C++编写的服务器进程监控工具,它具备选择监控单个或多个进程、进程崩溃时自动重启以及服务器日志...

    进程监控小程序,可以监管某个进程

    进程监控小程序是一款非常实用的工具,它主要用于对特定的计算机进程进行实时监控。在IT行业中,进程是操作系统中运行的程序实例,每个进程都有独立的内存空间和资源,因此管理和监控进程对于系统的稳定性和性能至关...

    进程监控驱动,源码

    "进程监控驱动"是一种特殊的驱动程序,它专注于监控和管理操作系统中的进程活动。本篇文章将深入探讨进程监控驱动的基本概念、其工作原理以及如何实现一个简单的进程创建回调示例。 首先,我们要理解什么是进程监控...

    linux进程监控与自动重启的简单实现方法

    linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。 crontab...

    C#用户、进程监控用户、进程监控

    在IT领域,用户和进程监控是系统管理的重要组成部分,尤其在使用C#编程语言进行开发时,理解并掌握这些概念对于构建高效稳定的软件系统至关重要。本文将深入探讨用户监控和进程监控在C#中的实现与应用。 用户监控...

    基于Hook进程监控的设计与实现

    ### 基于Hook进程监控的设计与实现 #### 一、引言 随着计算机技术的发展,对于系统资源的安全性及管理需求越来越高。Windows操作系统提供了一种名为“钩子”(HOOK)的技术,允许开发者通过安装特定类型的钩子函数...

    windows进程监控

    Windows进程监控是一个强大的系统诊断工具,它允许用户实时跟踪和分析系统中运行的进程对文件系统和注册表的操作。ProcessMonitor是微软开发的一款免费工具,它整合了早期的FileMon和RegMon,提供了全面的系统活动...

    进程监控程序C#源码(类似于任务管理器)

    进程监控是计算机系统管理的重要部分,它允许用户查看和控制正在运行的进程。在Windows操作系统中,任务管理器是最常见的进程监控工具。本项目提供的是一款使用C#编程语言编写的进程监控程序,其界面设计与Windows...

    进程监控--启动进程 关闭多余的进程

    进程监控是IT系统管理中的重要环节,它有助于确保系统的稳定运行和资源的有效利用。本文将深入探讨"进程监控--启动进程 关闭多余的进程"这一主题,以及如何通过程序实现这样的功能。 首先,我们要理解什么是进程。...

    进程监控代码

    进程监控是系统管理中的重要环节,它可以帮助我们了解系统中各个程序的运行状态,及时发现并解决问题。在编程领域,实现进程监控代码是一项常见的任务,特别是在服务器管理和分布式系统中。以下是一些关于“进程监控...

    进程监控程序

    进程监控程序是IT系统管理中的一个重要工具,它用于持续观察系统中的特定进程,确保这些进程在运行时的稳定性。在给定的“进程监控程序”主题中,我们主要讨论的是如何利用DOS命令来实现这样的功能,以及如何通过...

    Windows进程监控

    在Windows操作系统中,进程监控是一项重要的系统管理任务,它允许用户查看并理解系统中运行的各个进程的行为。"Windows进程监控"是一个专题,主要关注如何有效地监控和分析系统中的进程活动。下面将详细介绍Windows...

    安卓后台服务相关-android双进程监控保证服务杀死后重启.rar

    本压缩包"安卓后台服务相关-android双进程监控保证服务杀死后重启.rar"就提供了这样的解决方案,探讨了如何通过双进程监控来确保服务的稳定运行。 首先,我们来理解一下什么是双进程监控。在Android中,服务通常在...

    进程监控和守护 linux C

    进程监控 进程守护 linux C语言 j进程重启 进程管理 利用linux C语言编写,读取配置文件里面要求启动的程序,并进行实时监控,若进程异常退出,就重新启动 主要功能: 1.读取配置文件程序 2.启动进程 3.监控进程,...

    进程监控守护工具-当监控列表中的进程挂掉后会自动重新启动

    进程监控守护工具是一种重要的系统管理软件,主要用于确保关键服务或应用程序在系统中持续稳定运行。在标题和描述中提到的工具,它具有自动重启进程的功能,当监控列表中的某个进程意外终止时,该工具能够自动检测到...

    易语言源码利用WMI对象实现进程监控.rar

    本压缩包“易语言源码利用WMI对象实现进程监控.rar”包含了一个使用易语言编写的程序,该程序利用Windows Management Instrumentation(WMI)对象来监控系统中的进程。WMI是微软提供的一种系统管理接口,它允许...

    linux进程监控和进程守护程序

    Linux系统中,进程监控和进程守护程序是非常重要的组成部分。进程监控主要是对正在运行的进程进行监视和管理,以便确保系统稳定运行,而进程守护程序则负责在进程出现问题时自动恢复,确保关键进程不中断。 首先来...

Global site tag (gtag.js) - Google Analytics