使用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实现把xml或xsl转换为html格式
Apr 08 Python
Python pickle模块用法实例分析
May 27 Python
Python 数据结构之队列的实现
Jan 22 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
Django 实现jwt认证的示例
Apr 30 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python是编译运行的验证方法
2015/01/30 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
python实现粒子群算法
2020/10/15 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
大学毕业登记表自我鉴定
2013/10/09 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
纠风工作实施方案
2014/03/15 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
士兵突击观后感
2015/06/16 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python