python编写守护进程

时间:2021-10-25 14:56:36

  linux环境下通常使用shell来写小脚本守护某个服务,最近强制自己使用python来写管理脚本,在实践中学习python。shell在linux管理方面固然简单便捷,命令行直接调用,但是python可以直接套用模块来实现,比如说打印日志:在shell中我们需要定义日期,打印信息等内容,脚本显得比较乱;而python通过logging模块或其他模块,让我们减少繁琐操作。
  下面我们就使用python监控mongodb的27018端口来体验下:

[test@localhost ~]vim mongo_guard.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import commands
import os
import logging

command = 'setsid /usr/local/bin/mongod --port 27018 --master --dbpath /data/mongodb_27018 --logpath /data/mongodb_27018/mongodb27018.log --logappend &'

logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/opt/shell/','mongodb.log'),
filemode = 'a')

#27018
output = commands.getstatusoutput('netstat -ntlp|grep :27018')
status = int(output[0])
if status > 0:
logging.error('mongo 27018 down')
os.system(command)
else:
logging.info('mongo 27018 ok')
# pass

在此我们调用了2个模块:
commands 执行系统命令,返回命令执行结果,用于检测端口是否存在
os 也是执行系统命令,但是不会返回执行结果
logging 用于打印日志,便于我们记录端口宕掉的时间,以便我们查看

在当前目录下生成的日志mongodb.log如下:

[test@localhost ~]$ cat mongodb.log 
Mon, 02 Nov 2015 16:20:48, mongo_guard.py, ERROR, mongo 27018 down
Mon, 18 Nov 2015 08:45:01, mongo_guard.py, INFO, mongo 27018 ok

以上日志格式如日志,日志级别等我们可以在logging模块自己定义。

注意: 在cron中执行python脚本,有可能出现脚本无法执行的情况,但是直接用在命令行下是可以运行的,这是由于cron的环境问题,我们可以通过在cron中打印日志,查看原因,如
/5 * * * python mongo_guard.py >> log 2>&1
也可以通过在cron中设置环境,如
PATH==/usr/local/jdk/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin