使用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中的条件判断语句与循环语句用法小结
Mar 21 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
Python制作词云的方法
Jan 03 Python
python查看模块,对象的函数方法
Oct 16 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
python可视化之颜色映射详解
Sep 15 Python
Python 数据可视化之Matplotlib详解
Nov 02 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
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
如何打开php的gd2库
2017/02/09 PHP
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
python递归函数绘制分形树的方法
2018/06/22 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
python中的tcp示例详解
2018/12/09 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Django时区详解
2019/07/24 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
python编写实现抽奖器
2020/09/10 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
报到证丢失证明
2014/01/11 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
先进个人事迹材料
2014/12/29 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers