使用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脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
Python lxml模块安装教程
Jun 02 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
python 爬取疫情数据的源码
Feb 09 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
yolov5返回坐标的方法实例
Mar 17 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生成随机密码的三种方法小结
2010/09/04 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
jquery属性过滤选择器使用示例
2013/06/18 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
python中upper是做什么用的
2020/07/20 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
自动一体化专业求职信
2014/03/15 职场文书
毕业生面试求职信
2014/06/23 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
领导班子四风表现材料
2014/08/23 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
戒赌保证书
2015/05/11 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA