使用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下如何让web元素的生成更简单的分析
Jul 17 Python
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
对于Python编程中一些重用与缩减的建议
Apr 14 Python
python异常和文件处理机制详解
Jul 19 Python
Django的信号机制详解
May 05 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
Python实现KNN邻近算法
Jan 28 Python
python方法生成txt标签文件的实例代码
May 10 Python
Sanic框架应用部署方法详解
Jul 18 Python
Python骚操作之动态定义函数
Mar 26 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 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生成随机数或者字符串的代码
2008/09/05 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
python爬虫中多线程的使用详解
2019/09/23 Python
python通过实例讲解反射机制
2019/10/17 Python
Pytorch之finetune使用详解
2020/01/18 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
韩国11街:11STREET
2018/03/27 全球购物
几个常见的软件测试问题
2016/09/07 面试题
外贸销售员求职的自我评价
2013/11/23 职场文书
给领导的致歉信范文
2014/01/13 职场文书
资产运营委托书范本
2014/10/16 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript