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的Django框架使用入门指引
Apr 15 Python
Python中的map()函数和reduce()函数的用法
Apr 27 Python
Python字符串格式化
Jun 15 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
python读取和保存图片5种方法对比
Sep 12 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
python 字符串常用函数详解
Sep 11 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
python实现局部图像放大
Nov 17 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 ajax 分页类代码
2008/11/13 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
Django自定义manage命令实例代码
2018/02/11 Python
将python代码和注释分离的方法
2018/04/21 Python
Python 函数list&read&seek详解
2019/08/28 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
python的launcher用法知识点总结
2020/08/07 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
2015年五一劳动节演讲稿
2015/03/18 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
spring 项目实现限流方法示例
2022/07/15 Java/Android