使用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的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python对象转JSON字符串的方法
Apr 27 Python
python append、extend与insert的区别
Oct 13 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
python 自动批量打开网页的示例
Feb 21 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
python中使用np.delete()的实例方法
Feb 01 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
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python3实现逐字输出的方法
2019/01/23 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
酒店管理自荐信
2013/10/23 职场文书
法学毕业生自荐信
2013/11/13 职场文书
安全检查验收制度
2014/01/12 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫