Python爬虫 监控进程

《Python爬虫 监控进程》

一:前言

python 语言具有良好的垃圾回收功能,但是实际运用爬虫的时候还是会出现内存逐渐增大的现象,包括数据库服务占用的内存也会不断增加。这样服务器或者电脑就会收到一定的影响。这次的代码就是通过对电脑内存或者相关指标的监控,达到规定的值后就会重启爬虫程序和数据库。这个监控还有很多优化的地方,不过应对一般的需要够用了,以后再继续丰富一下功能。

二:运行环境

  • python 3.6
  • cmder windows下的命令行工具 可使用很多linux 的命令
  • psutil 获取系统相关信息

三:监控进程的思路

主要问题:现在有个爬虫程序摆在我面前,它长时间爬着爬着爬虫程序和数据库的内存就会增大,因影响爬虫的继续和电脑或服务器的正常使用。

解决思路

    1. 通过判断cpu 和内存占用率 然后决定是否要杀死爬虫程序和数据库服务进程
    1. win下 通过 tasklisst 命令获取到我们需要的pid 然后杀死进程
    1. 重启爬虫程序和数据库
    1. 做个时间延迟并循环判断

通过以上4个步骤的思考主要问题基本就算解决了,下面就是代码实现的过程了。

四:实战代码

import os
import psutil
import time
import sys


def start_spider():
    os.popen('python spider_name')
    print('start spider succeed')


def start_mongo():
    os.popen('mongod --dbpath=c:\data\db')
    pid = os.popen("tasklist | grep mongod | awk '{print $2}'").read()[:-1]
    print('start mongod succeed')
    print('mongo pid: {}'.format(pid))


def kill_spider(pid):
    os.popen('taskkill /pid {} /f'.format(str(pid)))
    print('kill spider over pid: {}'.format(pid))


def kill_mongo():
    pid = os.popen("tasklist | grep mongod | awk '{print $2}'").read()[:-1]
    if pid:
        os.popen('taskkill /pid {} /f'.format(pid))
        print('kill mongo over pid: {}'.format(pid))
    else:
        print('no mongo')


def judge_spider(spider_pid):
    p = psutil.Process(spider_pid)
    memory_percent = psutil.virtual_memory().percent
    pid_memory_percent = p.memory_percent()
    print('memory_percent: ' + str(memory_percent), 'pid_memory_percent: ' + str(pid_memory_percent))
    if memory_percent > int(default_memory_percent):
        kill_spider(spider_pid)
        kill_mongo()
        time.sleep(5)
        print('restart spider and mongo')
        main()
    else:
        time.sleep(180)
        judge_spider(spider_pid)


def main():
    start_mongo()
    start_spider()
    guardian_pwd = str(os.getpid())
    pids = os.popen("tasklist | grep python | awk '{print $2}'").read()
    pids = pids.split('\n')[:-1]
    if guardian_pwd in pids:
        pids.remove(guardian_pwd)
    if not pids:
        print('no pid, please start spider process')
        return
    spider_pid = pids[-1]
    print('spider_pid: ', spider_pid)
    judge_spider(int(spider_pid))


if __name__ == '__main__':
    spider_name = sys.argv[1]
    default_memory_percent = sys.argv[2]
    main()

使用方式:python 本程序名称 爬虫名称 内存占用率
例如:python guardian.py tieba.py 80

五:总结

先这样码上,具体的说明稍后有空补上。本次代码保存在 Github中 https://github.com/rieuse/learnPython/tree/master/guardian

    原文作者:rieuse
    原文地址: https://www.jianshu.com/p/e4b98d4f86c2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞