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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
用实例分析Python中method的参数传递过程
Apr 02 Python
Python中zfill()方法的使用教程
May 20 Python
python实现发送邮件功能代码
Dec 14 Python
Python绘制的二项分布概率图示例
Aug 22 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
NumPy中的维度Axis详解
Nov 26 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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安全配置方法
2007/06/16 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
PHP实现文件下载详解
2014/11/27 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
js仿360开机效果
2019/12/26 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python双向循环链表实现方法分析
2018/07/30 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
Java里面有没有全局变量?为什么?
2015/02/06 面试题
学生打架检讨书1000字
2014/01/16 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
合作意向协议书
2015/01/29 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书