python守护进程监控hive server

Linux就该这么学

1.  首先将hive thrift server添加到系统服务后台运行    添加方法地址http://jiedushi.blog.51cto.com/673653/608990

2.   利用python daemon守护进程监控hive server进程 ,代码如下

 

[html] view plaincopyprint?

 

  1. #!/usr/bin/env python  
  2.   
  3. import sys, os, time, atexit, string  
  4. from signal import SIGTERM  
  5.   
  6. class Daemon:  
  7.     def __init__(self, pidfile, stdin='/dev/null'stdout='/dev/null'stderr='/dev/null'):  
  8.         self.stdin = stdin  
  9.         self.stdout = stdout  
  10.         self.stderr = stderr  
  11.         self.pidfile = pidfile  
  12.   
  13.     def _daemonize(self):  
  14.         try:  
  15.             pid = os.fork()  
  16.             if pid > 0:  
  17.                 sys.exit(0)  
  18.         except OSError, e:  
  19.             sys.stderr.write('fork #1 failed: %d (%s)\n' % (e.errno, e.strerror))  
  20.             sys.exit(1)  
  21.         os.setsid()  
  22.         os.chdir("/")  
  23.         os.umask(0)  
  24.   
  25.         try:  
  26.             pid = os.fork()  
  27.             if pid > 0:  
  28.                 sys.exit(0)  
  29.         except OSError, e:  
  30.             sys.stderr.write('fork #2 failed: %d (%s)\n' % (e.errno, e.strerror))  
  31.             sys.exit(1)  
  32.   
  33.         sys.stdout.flush()  
  34.         sys.stderr.flush()  
  35.         si = file(self.stdin, 'r')  
  36.         so = file(self.stdout, 'a+')  
  37.         se = file(self.stderr, 'a+', 0)  
  38.         os.dup2(si.fileno(), sys.stdin.fileno())  
  39.         os.dup2(so.fileno(), sys.stdout.fileno())  
  40.         os.dup2(se.fileno(), sys.stderr.fileno())  
  41.   
  42.         atexit.register(self.delpid)  
  43.         pid = str(os.getpid())  
  44.         file(self.pidfile,'w+').write('%s\n' % pid)  
  45.   
  46.     def delpid(self):  
  47.         os.remove(self.pidfile)  
  48.   
  49.     def start(self):  
  50.         try:  
  51.             pf = file(self.pidfile,'r')  
  52.             pid = int(pf.read().strip())  
  53.             pf.close()  
  54.         except IOError:  
  55.             pid = None  
  56.   
  57.         if pid:  
  58.             message = 'pidfile %s already exist. Daemon already running?\n'  
  59.             sys.stderr.write(message % self.pidfile)  
  60.             sys.exit(1)  
  61.   
  62.         self._daemonize()  
  63.         self._run()  
  64.   
  65.     def stop(self):  
  66.         try:  
  67.             pf = file(self.pidfile,'r')  
  68.             pid = int(pf.read().strip())  
  69.             pf.close()  
  70.         except IOError:  
  71.             pid = None  
  72.   
  73.         if not pid:  
  74.             message = 'pidfile %s does not exist. Daemon not running?\n'  
  75.             sys.stderr.write(message % self.pidfile)  
  76.             return  
  77.   
  78.         try:  
  79.             while 1:  
  80.                 os.kill(pid, SIGTERM)  
  81.                 time.sleep(0.1)  
  82.                 os.system("kill -9 `jps|grep RunJar|awk '{print $1}'`")  
  83.         except OSError, err:  
  84.             err = str(err)  
  85.             if err.find('No such process') > 0:  
  86.                 if os.path.exists(self.pidfile):  
  87.                     os.remove(self.pidfile)  
  88.             else:  
  89.                 print str(err)  
  90.                 sys.exit(1)  
  91.   
  92.     def restart(self):  
  93.         self.stop()  
  94.         self.start()  
  95. class MyDaemon(Daemon):  
  96.     def _run(self):  
  97.         while True:  
  98.             proccess = os.popen("jps|grep RunJar|awk '{print $1}'|wc -l").read().strip()  
  99.             port = os.popen("netstat -tnl|grep 10000|awk '{print $4}'|grep 10000|wc -l").read().strip()  
  100.             if proccess == '0':  
  101.                 os.system('service hive-thrift start')  
  102.             time.sleep(2)  
  103. if __name__ == '__main__':  
  104.                 daemon = MyDaemon('/tmp/watch_process.pid')  
  105.                 if len(sys.argv) == 2:  
  106.                                 if 'start' == sys.argv[1]:  
  107.                                                 daemon.start()  
  108.                                 elif 'stop' == sys.argv[1]:  
  109.                                                 daemon.stop()  
  110.                                 elif 'restart' == sys.argv[1]:  
  111.                                                 daemon.restart()  
  112.                                 else:  
  113.                                                 print 'Unknown command'  
  114.                                                 sys.exit(2)  
  115.                                 sys.exit(0)  
  116.                 else:  
  117.                                 print 'usage: %s start|stop|restart' % sys.argv[0]  
  118.                                 sys.exit(2)  



将代码保存为hivemonitor.py  赋予可执行权限

 

chmod +x hivemonitor.py

运行脚本./hivemonitor.py  start

 

上面脚本在centos 5.8  python 2.7环境测试通过

本文由 CentOS中文站 - 专注Linux技术 作者:centos 发表,其版权均为 CentOS中文站 - 专注Linux技术 所有,文章内容系作者个人观点,不代表 CentOS中文站 - 专注Linux技术 对观点赞同或支持。如需转载,请注明文章来源。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注