文档章节

Python daemon example

山南子
 山南子
发布于 2017/07/21 09:41
字数 360
阅读 25
收藏 0
  1. #!/usr/bin/env python

  2.  

  3. import sys, os, time, atexit

  4. from signal import SIGTERM

  5.  

  6. class Daemon:

  7.         """

  8.         A generic daemon class.

  9.        

  10.         Usage: subclass the Daemon class and override the run() method

  11.         """

  12.         def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):

  13.                 self.stdin = stdin

  14.                 self.stdout = stdout

  15.                 self.stderr = stderr

  16.                 self.pidfile = pidfile

  17.        

  18.         def daemonize(self):

  19.                 """

  20.                 do the UNIX double-fork magic, see Stevens' "Advanced

  21.                 Programming in the UNIX Environment" for details (ISBN 0201563177)

  22.                 http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16

  23.                 """

  24.                 try:

  25.                         pid = os.fork()

  26.                         if pid > 0:

  27.                                 # exit first parent

  28.                                 sys.exit(0)

  29.                 except OSError, e:

  30.                         sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))

  31.                         sys.exit(1)

  32.        

  33.                 # decouple from parent environment

  34.                 os.chdir("/")

  35.                 os.setsid()

  36.                 os.umask(0)

  37.        

  38.                 # do second fork

  39.                 try:

  40.                         pid = os.fork()

  41.                         if pid > 0:

  42.                                 # exit from second parent

  43.                                 sys.exit(0)

  44.                 except OSError, e:

  45.                         sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))

  46.                         sys.exit(1)

  47.        

  48.                 # redirect standard file descriptors

  49.                 sys.stdout.flush()

  50.                 sys.stderr.flush()

  51.                 si = file(self.stdin, 'r')

  52.                 so = file(self.stdout, 'a+')

  53.                 se = file(self.stderr, 'a+', 0)

  54.                 os.dup2(si.fileno(), sys.stdin.fileno())

  55.                 os.dup2(so.fileno(), sys.stdout.fileno())

  56.                 os.dup2(se.fileno(), sys.stderr.fileno())

  57.        

  58.                 # write pidfile

  59.                 atexit.register(self.delpid)

  60.                 pid = str(os.getpid())

  61.                 file(self.pidfile,'w+').write("%s\n" % pid)

  62.        

  63.         def delpid(self):

  64.                 os.remove(self.pidfile)

  65.  

  66.         def start(self):

  67.                 """

  68.                 Start the daemon

  69.                 """

  70.                 # Check for a pidfile to see if the daemon already runs

  71.                 try:

  72.                         pf = file(self.pidfile,'r')

  73.                         pid = int(pf.read().strip())

  74.                         pf.close()

  75.                 except IOError:

  76.                         pid = None

  77.        

  78.                 if pid:

  79.                         message = "pidfile %s already exist. Daemon already running?\n"

  80.                         sys.stderr.write(message % self.pidfile)

  81.                         sys.exit(1)

  82.                

  83.                 # Start the daemon

  84.                 self.daemonize()

  85.                 self.run()

  86.  

  87.         def stop(self):

  88.                 """

  89.                 Stop the daemon

  90.                 """

  91.                 # Get the pid from the pidfile

  92.                 try:

  93.                         pf = file(self.pidfile,'r')

  94.                         pid = int(pf.read().strip())

  95.                         pf.close()

  96.                 except IOError:

  97.                         pid = None

  98.        

  99.                 if not pid:

  100.                         message = "pidfile %s does not exist. Daemon not running?\n"

  101.                         sys.stderr.write(message % self.pidfile)

  102.                         return # not an error in a restart

  103.  

  104.                 # Try killing the daemon process       

  105.                 try:

  106.                         while 1:

  107.                                 os.kill(pid, SIGTERM)

  108.                                 time.sleep(0.1)

  109.                 except OSError, err:

  110.                         err = str(err)

  111.                         if err.find("No such process") > 0:

  112.                                 if os.path.exists(self.pidfile):

  113.                                         os.remove(self.pidfile)

  114.                         else:

  115.                                 print str(err)

  116.                                 sys.exit(1)

  117.  

  118.         def restart(self):

  119.                 """

  120.                 Restart the daemon

  121.                 """

  122.                 self.stop()

  123.                 self.start()

  124.  

  125.         def run(self):

  126.                 """

  127.                 You should override this method when you subclass Daemon. It will be called after the process has been

  128.                 daemonized by start() or restart().

  129.                 """

本文转载自:https://gist.github.com/marazmiki/3618191

共有 人打赏支持
山南子
粉丝 0
博文 48
码字总数 16482
作品 0
海淀
后端工程师
Python 模拟linux守护进程

用python模拟linux的守护进程,本篇主要模拟过程。不过也可以用现成的库来直接编写python版的守护进程程序。 参考代码如下: #!/usr/bin/python import sys,os,time,atexitfrom signal impor...

China_OS
2013/04/14
0
5
Centos7安装Python3并兼容Python2的方法

Centos7安装Python3的方法 由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。 [root@VM_105_217_centos Python-3.6.2]# pythonPython 2....

宿小帅
06/01
0
0
第十一课(下):grep,sed,awk三剑客

grep命令 grep [-cinvABC] 'word' filename -c行数 -i不区分大小写 -n显示行号 -v取反 -r遍历所有子目录 -A后面跟数字,过滤出符合要求的行以及下面n行 -B后面跟数字,过滤出符合要求的行以及...

Linux学习笔记
06/06
0
0
用Cython编译写出更快的Python代码

原文地址: http://www.behnel.de/cython200910/talk.html以下为原文 About myself Passionate Python developer since 2002 after Basic, Logo, Pascal, Prolog, Scheme, Java, C, ... CS s......

toil
2015/06/19
0
0
Robot Framework+SSHLibrary实现自动化运维质量检测

Robot Framework+SSHLibrary介绍 首先,介绍一下robotframework,oschina这么介绍: Robot Framework 是一个关键词驱动的自动测试框架。测试用例位于HTML或者TSV(以tab分隔值)文件,使用在测...

超爱fitnesse
2015/02/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
35分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
1
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0
Android中的设计模式之命令模式

参考 《设计模式:可复用面向对象软件的基础 》5.2 Command 命令 对象行为型模式 《Android源码设计模式解析与实战》第11章 让程序畅通执行--命令模式 意图 将一个请求封装为一个对象,从而使...

newtrek
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部