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实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Django分组聚合查询实例分享
Apr 29 Python
基于python检查矩阵计算结果
May 21 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
增大python字体的方法步骤
Jul 05 Python
如何用Python搭建gRPC服务
Jun 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
php文件上传的例子及参数详解
2013/12/12 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python之py2exe打包工具详解
2017/06/14 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
python @classmethod 的使用场合详解
2019/08/23 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
Python中logger日志模块详解
2020/08/04 Python
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
一些Solaris面试题
2013/03/22 面试题
《小猪家的桃花树》教学反思
2014/04/11 职场文书
单位承诺书格式
2014/05/21 职场文书
出国签证在职证明
2014/09/20 职场文书
高质量“欢迎词”
2019/04/03 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
php中pcntl_fork详解
2021/04/01 PHP
详解NodeJS模块化
2021/06/15 NodeJs
python异步的ASGI与Fast Api实现
2021/07/16 Python
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js