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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python从MP3文件获取id3的方法
Jun 15 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
python实现K最近邻算法
Jan 29 Python
python截取两个单词之间的内容方法
Dec 25 Python
Python数据类型之String字符串实例详解
May 08 Python
如何在django中实现分页功能
Apr 22 Python
pandas的resample重采样的使用
Apr 24 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 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实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
JS中setTimeout()的用法详解
2013/04/14 Javascript
js select option对象小结
2013/12/20 Javascript
玩转方法:call和apply
2014/05/08 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
用Python中的字典来处理索引统计的方法
2015/05/05 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
C语言笔试集
2012/07/24 面试题
电子技术专业中专生的自我评价
2013/12/17 职场文书
企业军训感想
2014/02/07 职场文书
农林环境专业求职信
2014/03/13 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
全国助残日活动总结
2015/05/11 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
深入解析MySQL索引数据结构
2021/10/16 MySQL
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技