使用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调用cmd复制文件代码分享
Dec 27 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
Python列表(List)知识点总结
Feb 18 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
python爬虫之爬取笔趣阁小说
Apr 22 Python
windows安装python超详细图文教程
May 21 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实现的美国50个州选择列表实例
2015/04/20 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
python静态方法实例
2015/01/14 Python
Django框架中方法的访问和查找
2015/07/15 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
pygame实现成语填空游戏
2019/10/29 Python
如何基于Python批量下载音乐
2019/11/11 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
求职信范文怎么写
2014/01/29 职场文书
静心口服夜广告词
2014/03/20 职场文书
保研推荐信范文
2015/03/25 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
2016年师德学习心得体会
2016/01/12 职场文书