使用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计算方程式根的方法
May 07 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
分享几道你可能遇到的python面试题
Jul 24 Python
Python导入模块时遇到的错误分析
Aug 30 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
基于Python的Jenkins的二次开发操作
May 12 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
pytorch学习教程之自定义数据集
Nov 10 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 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 5.0 Pear安装方法
2006/12/06 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
初入社会应届生求职信
2013/11/18 职场文书
求职简历中自我评价
2014/01/28 职场文书
医学类个人求职信范文
2014/02/05 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
公积金贷款承诺书
2015/04/30 职场文书
同事离别感言
2015/08/04 职场文书
计算机教师工作总结
2015/08/13 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL