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错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
django实现支付宝支付实例讲解
Oct 17 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
Python配置pip国内镜像源的实现
Aug 20 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 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学习 计数器实例代码
2008/06/15 PHP
php中chdir()函数用法实例
2014/11/13 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
护士思想汇报
2014/01/12 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
班班通校本培训方案
2014/03/12 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
五好家庭事迹材料
2014/12/20 职场文书
青年文明号申报材料
2014/12/23 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
KTV员工管理制度
2015/08/06 职场文书
MYSQL 运算符总结
2021/11/11 MySQL
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android