使用Python编写Linux系统守护进程实例


Posted in Python onFebruary 03, 2015

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。?维基百科

守护进程区别于普通用户登陆系统后运行的进程,它是直接由系统初始化,和系统用户没有关系,而用户开启的进程依存与用户连接的终端,当终端退出或断开,进程也会随着终止。
来看一下我Linux试验机的进程状态:

[root@home tmp]# ping www.baidu.com > /dev/null &
[1] 2759
[root@home tmp]# pstree -p
systemd(1)-+-agetty(157)
      |-agetty(163)
      |-avahi-daemon(129)---avahi-daemon(134)
      |-avahi-dnsconfd(125)
      |-crond(121)
      |-dbus-daemon(130)
      |-haveged(128)
      |-ifplugd(126)
      |-nginx(226)---nginx(227)
      |-ntpd(223)
      |-python(2727)
      |-rngd(124)
      |-sshd(216)---sshd(2683)---bash(2690)-+-ping(2759)
      |                   `-pstree(2760)
      |-systemd(2687)---(sd-pam)(2688)
      |-systemd-journal(76)
      |-systemd-logind(127)
      |-systemd-udevd(89)
      `-wpa_supplicant(153)

可以看到,当前有一个ping程序在后台运行,如果如断开连接,再次去登陆,ping程序是已经终止了的。也就是说,普通进程,和用户会话相关,那么,如何去编写一个和用户会话无关,一直运行在后台的进程呢?大家可能注意到了上面pid为2727的python,如果只是正常打开python,它应该是运行在bash下的,而这里却直接运行在systemd下,实际上,它是一个守护进程,来看一下python编写linux守护进程的简单实现:

#!/usr/bin/env python
import os
import signal
import time
logfile="/tmp/daemon.log"
pid=os.fork()
#exit parent process
if pid: exit()
#get the pid of subprocess
daeid=os.getpid()
os.setsid()
os.umask(0)
os.chdir("/")
#Redirection file descriptor
fd=open("/dev/null","a+")
os.dup2(fd.fileno(),0)
os.dup2(fd.fileno(),1)
os.dup2(fd.fileno(),2)
fd.close()
log=open(logfile,'a')
log.write('Daemon start up at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
log.close()
def reload(a,b):
  log=open(logfile,'a')
  log.write('Daemon reload at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
  log.close()
while True:
  signal.signal(signal.SIGHUP,reload)
  time.sleep(2)

要点是利用linux中,当一个进程的父进程终止是,系统会接管这个进程,让init成为这个进程的父进程,这时候这个进程就成为了一个守护进程。需要注意的是,通过setsid,umask和chdir做工作目录设置、关闭文件描述符、设置文件创建掩码等操作。把上面的代码保存起来,给于运行权限,并用python打开,就会看到有一个新的守护进程在运行,并且能够处理系统发送的SIGHUP信号。

以上程序仅用来测试,仅能够处理系统SIGHUP信号,请使用kill pid结束进程。

Python 相关文章推荐
跟老齐学Python之让人欢喜让人忧的迭代
Oct 02 Python
Python中subprocess模块用法实例详解
May 20 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
wxpython实现图书管理系统
Mar 12 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
django最快程序开发流程详解
Jul 19 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
Python中使用select模块实现非阻塞的IO
Feb 03 #Python
Python异常学习笔记
Feb 03 #Python
Python中的迭代器漫谈
Feb 03 #Python
Python描述器descriptor详解
Feb 03 #Python
理解Python中的With语句
Feb 02 #Python
Linux环境下MySQL-python安装过程分享
Feb 02 #Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 #Python
You might like
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
学习Vue组件实例
2018/04/28 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
python查看FTP是否能连接成功的方法
2015/07/30 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
python安装scipy的方法步骤
2019/06/26 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
给老师的感谢信
2015/01/20 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
推荐信范文大全
2015/03/27 职场文书