python daemon守护进程实现


Posted in Python onAugust 27, 2016

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。
守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就是表示daemon的意思。

守护进程的编写步骤:

1、fork子进程,然后父进程退出,此时子进程会被init进程接管。
2、修改子进程的工作目录,创建新进程组合新会话,修改umask。
3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。
4、重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null
完成上面的4个步骤,那么最终的孙子进程就称为守护进程,先看下代码,后面分析下步骤的原因。

#!/usr/bin/env python
#coding=utf8
def createDaemon():
  import os, sys, time
  #产生子进程,而后父进程退出
  try:
    pid = os.fork()
    if pid > 0:sys.exit(0)
  except OSError,error:
    print 'fork'
    sys.exit(1)
 
  #修改子进程工作目录
  os.chdir("/")
  #创建新的会话,子进程成为会话的首进程
  os.setsid()
  #修改工作目录的umask
  os.umask(0)
 
  #创建孙子进程,而后子进程退出
  try:
    pid = os.fork()
    if pid > 0:
      print "Daemon PID %d"%pid
      sys.exit(0)
  except OSError,error:
    print "fork"
    sys.exit(1)
  run()
 
 
def ping():
  import os
  os.system('ping www.baidu.com >/dev/nul')
 
def run():
  while True:
    import time,threading
    fd = open('/home/ping.log', 'a')
    fd.write("start time---------:%s\n"%time.ctime())
    fd.flush()
    t=threading.Thread(target=ping,args=())
    t.start()
    time.sleep(3)
    fd.write("end of time--------:%s\n"%time.ctime())
    fd.flush()
  fd.close()
 
if __name__=='__main__':
  createDaemon()

1、fork子进程,父进程退出
通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被init进程接管,从而也就脱离了终端控制。
2.修改子进程的工作目录
子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。
3.创建新会话
使用setsid后,子进程就会成为新会话的首进程,子进程会成为新进程组的组长进程,子进程没有控制终端。
4.修改umask
由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题
5.fork孙子进程,子进程退出
经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题,fork孙子进程处理,
6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null
因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到/dev/null,就是丢弃的意思

我们来运行一个这个程序,看看效果

python daemon守护进程实现

从上图可以看出这个脚本程序已经放入后台,只能使用killall方式来结束掉,
接下来我们去看下记录的日志

python daemon守护进程实现

Python 相关文章推荐
跟老齐学Python之集合(set)
Sep 24 Python
Django验证码的生成与使用示例
May 20 Python
python读取图片任意范围区域
Jan 23 Python
python+logging+yaml实现日志分割
Jul 22 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
python求解汉诺塔游戏
Jul 09 Python
Python 如何测试文件是否存在
Jul 31 Python
Python类的继承super相关原理解析
Oct 22 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 Python
Python+微信接口实现运维报警
Aug 27 #Python
python实现获取Ip归属地等信息
Aug 27 #Python
python简单实现获取当前时间
Aug 27 #Python
python使用psutil模块获取系统状态
Aug 27 #Python
Django Highcharts制作图表
Aug 27 #Python
Python连接DB2数据库
Aug 27 #Python
使用python绘制常用的图表
Aug 27 #Python
You might like
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
python binascii 进制转换实例
2019/06/12 Python
Python Django view 两种return的实现方式
2020/03/16 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
党政领导班子群众路线对照检查材料
2014/10/26 职场文书