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通过BF算法实现关键词匹配的方法
Mar 13 Python
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
python3操作微信itchat实现发送图片
Feb 24 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
python实现批量注册网站用户的示例
Feb 22 Python
pandas删除指定行详解
Apr 04 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python脚本和网页有何区别
Jul 02 Python
selenium+超级鹰实现模拟登录12306
Jan 24 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 遍历XP文件夹下所有文件
2008/11/27 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python中的exec、eval使用实例
2014/09/23 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
人事行政专员岗位职责
2014/07/23 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
离职信范本
2015/06/23 职场文书
六一活动主持词
2015/06/30 职场文书
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技