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二维码生成库qrcode安装和使用示例
Dec 16 Python
python通过yield实现数组全排列的方法
Mar 18 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
Python动态声明变量赋值代码实例
Dec 30 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
python中wheel的用法整理
Jun 15 Python
python中str内置函数用法总结
Dec 27 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-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
js倒计时显示实例
2016/12/11 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python 实现生成均匀分布的点
2019/12/05 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
护理专业推荐信
2013/11/07 职场文书
精彩的大学生自我评价
2013/11/17 职场文书
安全生产责任书
2014/03/12 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
区域销售大会开幕词
2016/03/04 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
JavaScript 实现页面滚动动画
2021/04/24 Javascript
python opencv通过按键采集图片源码
2021/05/20 Python
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android