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爬虫:通过关键字爬取百度图片
Feb 17 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
Java分治归并排序算法实例详解
Dec 12 Python
python3+PyQt5实现拖放功能
Apr 24 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
python中join()方法介绍
Oct 11 Python
Python调用服务接口的实例
Jan 03 Python
使用python爬取抖音视频列表信息
Jul 15 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
python对execl 处理操作代码
Jun 22 Python
浅析python中的del用法
Sep 02 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 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冒泡算法详解(递归实现)
2014/11/10 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Django用户身份验证完成示例代码
2020/04/03 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
python 实现IP子网计算
2021/02/18 Python
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
业务部经理岗位职责
2014/01/04 职场文书
大学新学期计划书
2014/04/28 职场文书
运动员口号
2014/06/09 职场文书
小学教师师德整改措施
2014/09/29 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
入党自传范文2015
2015/06/26 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python