使用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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
Pycharm更换python解释器的方法
Oct 29 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python中嵌套函数的实操步骤
Feb 27 Python
python3中的eval和exec的区别与联系
Oct 10 Python
Python的形参和实参使用方式
Dec 24 Python
Python根据指定文件生成XML的方法
Jun 29 Python
Pygame框架实现飞机大战
Aug 07 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
python基础之模块的导入
Oct 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
php中$this->含义分析
2009/11/29 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
javascript面向对象之Javascript 继承
2010/05/04 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
什么是Python中的顺序表
2020/06/02 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python 爬取小说并下载的示例
2020/12/07 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
年度献血先进个人事迹材料
2014/02/14 职场文书
防灾减灾活动总结
2014/08/30 职场文书
国庆节标语大全
2014/10/08 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
一起来学习Python的元组和列表
2022/03/13 Python