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列表操作之extend和append的区别实例分析
Jul 28 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
python集合常见运算案例解析
Oct 17 Python
python文件读写代码实例
Oct 21 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
用python解压分析jar包实例
Jan 16 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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.ini中文版
2006/10/09 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
jquery实现广告上下滚动效果
2021/03/04 jQuery
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
应聘医药代表职位求职信
2013/10/21 职场文书
个人自我评价分享
2013/12/20 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
12岁生日演讲稿
2014/05/14 职场文书
学习型班组申报材料
2014/05/31 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
交通事故协议书范文
2014/10/23 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis