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 cookielib 登录人人网的实现代码
Dec 19 Python
python 动态获取当前运行的类名和函数名的方法
Apr 15 Python
Python内置数据类型详解
Aug 18 Python
python读取oracle函数返回值
Jul 18 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
Python快速排序算法实例分析
Nov 29 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
Python 实现定积分与二重定积分的操作
May 26 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
php 不同编码下的字符串长度区分
2009/09/26 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
全面了解js中的script标签
2016/07/04 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python range与enumerate函数区别解析
2020/02/28 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
客户经理岗位职责
2013/12/08 职场文书
上学迟到的检讨书
2014/01/11 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
春季防火方案
2014/05/10 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书