使用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分析nignx访问日志脚本分享
Feb 26 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
python各层级目录下import方法代码实例
Jan 20 Python
python上传时包含boundary时的解决方法
Apr 08 Python
200行python代码实现贪吃蛇游戏
Apr 24 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
Terran热键控制
2020/03/14 星际争霸
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
js检验密码强度(低中高)附图
2014/06/05 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
料理师求职信
2014/01/30 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
电气个人求职信范文
2014/02/04 职场文书
个人公开承诺书
2014/03/28 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS