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 相关文章推荐
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
python解释器spython使用及原理解析
Aug 24 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
python使用glob检索文件的操作
May 20 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 Python
Python的property属性详细讲解
Apr 11 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设计模式 注册表模式
2012/02/05 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
优化PHP程序的方法小结
2012/02/23 PHP
PHP的基本常识小结
2013/07/05 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
python实现问号表达式(?)的方法
2013/11/27 Python
python微信撤回监测代码
2019/04/29 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python中return如何写
2020/06/18 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
法院信息化建设方案
2014/05/21 职场文书
2014国庆节标语口号
2014/09/19 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
如何写好闭幕词
2019/04/02 职场文书
JS实现简单九宫格抽奖
2022/06/28 Javascript