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简单删除目录下文件以及文件夹的方法
May 27 Python
简述Python中的进程、线程、协程
Mar 18 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python ddt数据驱动最简实例代码
Feb 22 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 Python
Python self用法详解
Nov 28 Python
Python List remove()实例用法详解
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新手入门学习方法
2011/05/08 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
php实现的农历算法实例
2015/08/11 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
深入了解js原型模式
2019/05/30 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现划词翻译
2020/04/23 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
单身旅行者的单身假期:Just You
2018/04/08 全球购物
大学生党课思想汇报
2013/12/29 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
安全生产管理责任书
2014/04/16 职场文书
思想工作总结范文
2015/08/12 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS