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接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 Python
Python实现ping指定IP的示例
Jun 04 Python
Sanic框架路由用法实例分析
Jul 16 Python
python递归下载文件夹下所有文件
Aug 31 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
python 从list中随机取值的方法
Nov 16 Python
python中复数的共轭复数知识点总结
Dec 06 Python
python 6种方法实现单例模式
Dec 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
php获取某个目录大小的代码
2008/09/10 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php中的观察者模式简单实例
2015/01/20 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
python实现百度关键词排名查询
2014/03/30 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
质量工程师岗位职责
2013/11/16 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
入党自荐书范文
2015/03/05 职场文书
证婚人致辞精选
2015/07/28 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书