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回溯法实现数组全排列输出实例分析
Mar 17 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
Django values()和value_list()的使用
Mar 31 Python
Python 高效编程技巧分享
Sep 10 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
Django中ORM的基本使用教程
Dec 22 Python
python 数据类型强制转换的总结
Jan 25 Python
用Python写一个简易版弹球游戏
Apr 13 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP的历史和优缺点
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &
2010/02/09 PHP
php 操作符与控制结构
2012/03/07 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
简单的编程0基础下Python入门指引
2015/04/01 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
python实现简单遗传算法
2020/09/18 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
市场营销策划方案
2014/06/11 职场文书
合作协议书模板
2014/10/10 职场文书
党员转正大会主持词
2015/07/02 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
python ConfigParser库的使用及遇到的坑
2022/02/12 Python