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实现获取照片拍摄日期并重命名的方法
Sep 30 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
Python中拆分字符串的操作方法
Jul 23 Python
python 命令行传入参数实现解析
Aug 30 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
python如何导入依赖包
Jul 13 Python
python 实现音频叠加的示例
Oct 29 Python
Python实现视频自动打码的示例代码
Apr 08 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
php广告加载类用法实例
2014/09/23 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
twig模板常用语句实例小结
2016/02/04 PHP
php对象工厂类完整示例
2018/08/09 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
PyMongo安装使用笔记
2015/04/27 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python内置函数delattr的具体用法
2017/11/23 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
工程测量与监理专业应届生求职信
2013/11/27 职场文书
贷款委托书范本
2014/04/08 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书