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新手在作用域方面经常容易碰到的问题
Apr 03 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python中最大递归深度值的探讨
Mar 05 Python
详解Python下载图片并保存本地的两种方式
May 15 Python
安装docker-compose的两种最简方法
Jul 30 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
Python super()函数使用及多重继承
May 06 Python
Pygame Event事件模块的详细示例
Nov 17 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与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
什么是数组名
2012/05/10 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
工作决心书
2014/03/11 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
MySQL GTID复制的具体使用
2022/05/20 MySQL