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代码的打包与发布详解
Jul 30 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Php多进程实现代码
May 07 Python
python tkinter界面居中显示的方法
Oct 11 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
python 多进程队列数据处理详解
Dec 23 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
Python趣味挑战之实现简易版音乐播放器
May 28 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跨站刷票的实现代码
2013/06/18 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
firefo xml 读写实现js代码
2009/06/11 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
小程序input数据双向绑定实现方法
2019/10/17 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[19:15]DK战队纪录片
2014/09/02 DOTA
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
如何在python中执行另一个py文件
2020/04/30 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
厉行勤俭节约倡议书
2014/05/16 职场文书
2014年技术部工作总结
2014/12/12 职场文书
起诉书范文
2015/05/20 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android