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开发编码规范
Sep 08 Python
Python 第一步 hello world
Sep 25 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
在Django的视图中使用form对象的方法
Jul 18 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
python super()函数的基本使用
Sep 10 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 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
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python命名空间详解
2014/08/18 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python破解同事的压缩包密码
2020/10/14 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
奥巴马演讲稿
2014/01/08 职场文书
校运会广播稿100字
2014/01/27 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB