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代码真的很爽
Aug 26 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
python数据爬下来保存的位置
Feb 17 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
python 实现Requests发送带cookies的请求
Feb 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的session cookie错误
2009/08/09 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
python中enumerate的用法实例解析
2014/08/18 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
VC++笔试题
2014/10/13 面试题
医学生个人求职信范文
2013/09/24 职场文书
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
合作意向协议书范本
2014/03/31 职场文书
贷款担保书范文
2014/05/13 职场文书
二胎满月酒致辞
2015/07/29 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
python中subplot大小的设置步骤
2021/06/28 Python
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android