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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
在Python下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
python中子类调用父类函数的方法示例
Aug 18 Python
python定向爬取淘宝商品价格
Feb 27 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
python的常见矩阵运算(小结)
Aug 07 Python
python中return的返回和执行实例
Dec 24 Python
Python猴子补丁知识点总结
Jan 05 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
python四种出行路线规划的实现
Jun 23 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 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
简单实现jQuery弹幕效果
2017/05/06 jQuery
微信分享调用jssdk实例
2017/06/08 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
python生成器表达式和列表解析
2016/03/10 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
如何把python项目部署到linux服务器
2020/08/26 Python
Python jieba库分词模式实例用法
2021/01/13 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
经典公益广告词
2014/03/13 职场文书
食品安全工作方案
2014/05/07 职场文书
发展党员工作情况汇报
2014/10/28 职场文书