用python编写daemon监控进程并自动恢复(附Shell版)
import sys, os, time, atexit, string
from signal import SIGTERM
class Daemon:
def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
#需要获取调试信息,改为stdin='/dev/stdin', stdout='/dev/stdout', stderr='/dev/stderr',以root身份运行。
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.pidfile = pidfile
def _daemonize(self):
try:
pid = os.fork()
if pid > 0:
#退出主进程
sys.exit(0)
except OSError, e:
sys.stderr.write('fork #1 failed: %d (%s)\n' % (e.errno, e.strerror))
sys.exit(1)
os.chdir("/")
os.setsid()
os.umask(0)
#创建子进程
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
sys.stderr.write('fork #2 failed: %d (%s)\n' % (e.errno, e.strerror))
sys.exit(1)
#重定向文件描述符
sys.stdout.flush()
sys.stderr.flush()
si = file(self.stdin, 'r')
so = file(self.stdout, 'a+')
se = file(self.stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
#创建processid文件
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile,'w+').write('%s\n' % pid)
def delpid(self):
os.remove(self.pidfile)
def start(self):
#检查pid文件是否存在以探测是否存在进程
try:
pf = file(self.pidfile,'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if pid:
message = 'pidfile %s already exist. Daemon already running?\n'
sys.stderr.write(message % self.pidfile)
sys.exit(1)
#启动监控
self._daemonize()
self._run()
def stop(self):
#从pid文件中获取pid
try:
pf = file(self.pidfile,'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if not pid:
message = 'pidfile %s does not exist. Daemon not running?\n'
sys.stderr.write(message % self.pidfile)
return #重启不报错
#杀进程
try:
while 1:
os.kill(pid, SIGTERM)
time.sleep(0.1)
os.system('/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh stop datanode')
os.system('/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh stop tasktracker')
except OSError, err:
err = str(err)
if err.find('No such process') > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
else:
print str(err)
sys.exit(1)
def restart(self):
self.stop()
self.start()
def _run(self):
while True:
datanode = os.popen('ps -fe | grep "java" | grep "datanode" | grep -v "grep" | wc -l').read().strip()
tasktracker = os.popen('ps -fe | grep "java" | grep "tasktracker" | grep -v "grep" | wc -l').read().strip()
#选出进程中含有java且含有datanode|tasktracker且不含有grep,计算出现行数。修改上面的进程监控语句以适应其他应用需求
if datanode == '0':
os.system('/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh start datanode')
#修改这里的启动命令
if tasktracker == '0':
os.system('/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh start tasktracker')
#修改这里的启动命令
time.sleep(2)
#修改这里的停留时间
if __name__ == '__main__':
daemon = Daemon('/tmp/watch_process.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print 'Unknown command'
sys.exit(2)
sys.exit(0)
else:
print 'usage: %s start|stop|restart' % sys.argv[0]
sys.exit(2)
while true;
do
count=`ps -fe | grep "java" | grep "datanode" | grep -v "grep"`
if [ "$?" != "0" ]; then
/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh start datanode
fi
sleep 2
done
while true;
do
count=`ps -fe | grep "java" | grep "tasktracker" | grep -v "grep"`
if [ "$?" != "0" ]; then
/opt/modules/hadoop/hadoop-0.20.203.0/bin/hadoop-daemon.sh start tasktracker
fi
sleep 2
done
用python编写daemon监控进程并自动恢复(附Shell版)相关推荐
- linux shell脚本监控进程崩溃自动重启
linux shell脚本监控进程崩溃自动重启,由于目前有Python实现的通讯组件时不时会异常中断,在还没有找到问题的解决办法时先暂时用shell监控并自动重启处理. # ! /bin/shbase ...
- 使用Python编写Prometheus监控metrics接口
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 要使用python编写Prometheus监控,需要你先开启Prometheus集群.可以参考https://blog.csdn.net/luanpe ...
- 使用python编写一个完整的接口自动化用例
使用python编写一个完整的接口自动化用例 以聚合数据的 查询天气接口为例: import requestsclass HttpRequests: def __init__(self,url, pa ...
- 使用python编写自己的进程调试工具
今天浅读了<Python灰帽子>,让我对程序调试有了更清晰的认识.如果没有记错的话,我最早了解程序调试工具gdb,使用gdb去运行着带着符号表的C程序,后来我大致了解到程序调试的原理是对于 ...
- bat脚本实现监控进程功能-自动重启
参考这篇博文https://www.cnblogs.com/sunfie/p/7071424.html 不过它里面有一些空格问题,和for循环集中运行命令失败问题,并不能用. bat注意事项 set ...
- python 编程 远程监控进程数据
配置文件: ############################################################################### # Config file ...
- python能写什么脚本_如何用python编写一个阴阳师脚本(自动刷御魂,业原火)(2)...
在上一篇文章里,我们已经安装好了python,安装好了所有需要的库,现在可以开始码代码了嗷 先让我们来分析一下需要实现的脚本功能,首先就是这个开始战斗此时队友还没来... 当队友(舍友)进来时,开始战 ...
- python编写代码雨_花瓣雨飞舞的春天turtle版源代码
python flower rain花瓣雨飞舞的春天turtle版需要寻找"浪漫"吗?这里已经有了,音乐也为你配好了.你们相遇的日子,是否是在花瓣雨飞舞的春天? music已经响起 ...
- python编写学生选课系统程序卸载器_Python 简易版选课系统
一.创建学生类 ## 创建学生类 importrandomclassStudent:def __init__(self,num,name,address,course_lst=None): self. ...
最新文章
- 【算法基础】时间复杂度:大O阶方法
- 我们从那里来—子宫日记 Womb
- Oracle 优化器
- C++ Primer 第9章 顺序容器 第一次学习笔记
- sql server常用函数
- chrome的timeline的问题?
- linux怎么编译sharedptr,如何使用智能指针(例如auto_ptr r shared_ptr)在Linux上使用C++生成链接列表数据结构?...
- Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)
- express服务器多次访问数据库实例
- Redis安装(源码安装)
- Javascript实现完美继承
- labview学习之“创建数组”函数
- 坯子库曲面推拉教程_SU曲面建模太简单?还是网友技术太强大...
- 星际争霸2神族全兵种介绍
- 数据库服务器使用的RAID存储架构初步介绍
- Gsensor驱动概述
- 单源最短路径bellman算法
- 打造铁军团队(王牌军)的核心三点
- RenderDoc塞尔达荒野之息抓帧分析
- 安卓Vitamio播放课程视频