使用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跳出循环语句continue与break的区别
Aug 25 Python
python中requests模块的使用方法
Apr 08 Python
python中defaultdict的用法详解
Jun 07 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 Python
python程序的组织结构详解
Dec 06 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获得当前的脚本网址
2007/12/10 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
Python数组遍历的简单实现方法小结
2016/04/27 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python zip()函数使用方法解析
2019/10/31 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
python字典按照value排序方法
2020/12/28 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
水产养殖学应届生求职信
2013/09/29 职场文书
学生就业推荐信
2013/11/13 职场文书
中医专业职业生涯规划书范文
2014/01/04 职场文书
实习报告评语
2014/04/26 职场文书
初三新学期计划书
2014/05/03 职场文书
体育专业自荐书
2014/05/29 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
工作自我推荐信范文
2015/03/25 职场文书
2015年材料员工作总结
2015/04/30 职场文书
2015年环保局工作总结
2015/05/22 职场文书
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技