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实现telnet服务器的方法
Jul 10 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
python字符串str和字节数组相互转化方法
Mar 18 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 Python
Python实现归一化算法详情
Mar 18 Python
python的html标准库
Apr 29 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP错误处理函数
2016/04/03 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python字符编码判断方法分析
2016/07/01 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python实现学生成绩测评系统
2020/06/22 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
2021年最新用于图像处理的Python库总结
2021/06/15 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
使用CSS实现音波加载效果
2023/05/07 HTML / CSS