Python守护进程(daemon)代码实例


Posted in Python onMarch 06, 2015
# -*-coding:utf-8-*-
import sys, os

'''将当前进程fork为一个守护进程

  注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了
  所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有
  chdir() 和 umask()了
'''
def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'):
  '''Fork当前进程为守护进程,重定向标准文件描述符
    (默认情况下定向到/dev/null)
  '''
  #Perform first fork.
  try:
    pid = os.fork()
    if pid > 0:
      sys.exit(0) #first parent out
  except OSError, e:
    sys.stderr.write("fork #1 failed: (%d) %s\n" %(e.errno, e.strerror))
    sys.exit(1)

  #从母体环境脱离
  os.chdir("/")
  os.umask(0)
  os.setsid()
  #执行第二次fork
  try:
    pid = os.fork()
    if pid > 0:
      sys.exit(0) #second parent out
  except OSError, e:
    sys.stderr.write("fork #2 failed: (%d) %s]n" %(e.errno,e.strerror))
    sys.exit(1)

  #进程已经是守护进程了,重定向标准文件描述符
  for f in sys.stdout, sys.stderr: f.flush()
  si = file(stdin, 'r')
  so = file(stdout,'a+')
  se = file(stderr,'a+',0)
  os.dup2(si.fileno(), sys.stdin.fileno())
  os.dup2(so.fileno(), sys.stdout.fileno())
  os.dup2(se.fileno(), sys.stderr.fileno())

def _example_main():
  '''示例函数:每秒打印一个数字和时间戳'''
  import time
  sys.stdout.write('Daemon started with pid %d\n' % os.getpid())
  sys.stdout.write('Daemon stdout output\n')
  sys.stderr.write('Daemon stderr output\n')

  c = 0
  while True:
    sys.stdout.write('%d: %s\n' %(c, time.ctime()))
    sys.stdout.flush()
    c = c+1
    time.sleep(1)

if __name__ == "__main__":
  daemonize()
  _example_main()
'''
第一个fork是为了让shell返回,同时让你完成setsid(从你的控制终端移除,这样就不会意外地收到信号)。setsid使得这个进程成为“会话领导(session leader)”,即如果这个进程打开任何终端,该终端就会成为此进程的控制终端。我们不需要一个守护进程有任何控制终端,所以我们又fork一次。在第二次fork之后,此进程不再是一个“会话领导”,这样它就能打开任何文件(包括终端)且不会意外地再次获得一个控制终端

另外说明:
umask()函数为进程设置文件模式创建屏蔽字,并返回以前的值
在shell命令行输入:umask 就可知当前文件模式创建屏蔽字
常见的几种umask值是002,022和027,002阻止其他用户写你的文件,022阻止同组成员和其他用户写你的文件,027阻止同组成员写你的文件以及其他用户读写或执行你的文件
rwx-rwx-rwx 代表是777 所有的人都具有权限读写与执行

chmod()改变文件的权限位
int dup(int filedes) 返回新文件描述符一定是当前文件描述符中的最小数值
int dup2(int filedes, int filedes2);这两个函数返回的新文件描述符与参数filedes共享同一个文件表项。
'''
Python 相关文章推荐
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
python通过定义一个类实例作为ftp回调方法
May 04 Python
关于Python数据结构中字典的心得
Dec 04 Python
python3个性签名设计实现代码
Jun 19 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
Python实现二维曲线拟合的方法
Dec 29 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
django下创建多个app并设置urls方法
Aug 02 Python
Python类方法__init__和__del__构造、析构过程分析
Mar 06 #Python
Python列表生成器的循环技巧分享
Mar 06 #Python
Python装饰器使用示例及实际应用例子
Mar 06 #Python
Python迭代器和生成器介绍
Mar 06 #Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 #Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 #Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 #Python
You might like
PHP中函数内引用全局变量的方法
2008/10/20 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
Python中title()方法的使用简介
2015/05/20 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
浅析Python四种数据类型
2018/09/26 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
python 画函数曲线示例
2019/12/04 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
应聘教师推荐信
2013/10/31 职场文书
同事吵架检讨书
2014/02/05 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
离婚协议书范文2015
2015/01/26 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
MySQL优化及索引解析
2022/03/17 MySQL