使用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执行外部程序的常用方法小结
Mar 21 Python
Python 序列的方法总结
Oct 18 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
使用python爬取B站千万级数据
Jun 08 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
pygame实现五子棋游戏
Oct 29 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
python 实现的车牌识别项目
Jan 25 Python
Python如何让字典保持有序排列
Apr 29 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
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
pytorch之添加BN的实现
2020/01/06 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
保护环境倡议书300字
2014/05/19 职场文书
出纳工作检讨书
2014/10/18 职场文书
党员示范岗材料
2014/12/19 职场文书
合理化建议书
2015/02/04 职场文书
鲁迅故里导游词
2015/02/05 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
书法社团活动总结
2015/05/07 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
贫困证明书范文
2015/06/16 职场文书
地震捐款简报
2015/07/21 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
Python上下文管理器Content Manager
2021/06/26 Python
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL