使用Python编写Linux系统守护进程实例

 更新时间:2015年02月03日 11:59:31   投稿:junjie  
这篇文章主要介绍了使用Python编写Linux系统守护进程实例,本文先是讲解了什么是守护进程,然后给出了一个Python语言的简单实现,需要的朋友可以参考下

守护进程(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结束进程。

相关文章

  • OpenCV-Python 对图像的基本操作代码

    OpenCV-Python 对图像的基本操作代码

    这篇文章主要介绍了OpenCV-Python 对图像的基本操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    这篇文章主要介绍了讲解Python的Scrapy爬虫框架使用代理进行采集的方法,并介绍了随机使用预先设好的user-agent来进行爬取的用法,需要的朋友可以参考下
    2016-02-02
  • pygame学习笔记(4):声音控制

    pygame学习笔记(4):声音控制

    这篇文章主要介绍了pygame学习笔记(4):声音控制,本文讲解了pygame.mixer启动与初始化、播放声音片段wav文件、播放mp3、wma、ogg音乐文件、控制音量、制作mp3播放器中遇到的问题等内容,需要的朋友可以参考下
    2015-04-04
  • Python批量删除txt文本指定行的思路与代码

    Python批量删除txt文本指定行的思路与代码

    在深度学习项目中常常会处理各种数据集,下面这篇文章主要给大家介绍了关于Python批量删除txt文本指定行的思路与代码,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Python单元测试与测试用例简析

    Python单元测试与测试用例简析

    这篇文章主要介绍了Python单元测试与测试用例,结合简单实例形式分析了Python单元测试相关的原理、步骤与相关注意事项,需要的朋友可以参考下
    2019-11-11
  • 对python中的os.getpid()和os.fork()函数详解

    对python中的os.getpid()和os.fork()函数详解

    今天小编就为大家分享一篇对python中的os.getpid()和os.fork()函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python Numpy布尔数组在数据分析中的应用小结

    Python Numpy布尔数组在数据分析中的应用小结

    本文深入探讨了Python的Numpy库中的布尔数组功能,介绍了布尔运算、布尔索引的使用方法,并通过示例展示了如何在数据分析中利用布尔数组进行数据筛选和处理,感兴趣的朋友一起看看吧
    2024-09-09
  • python重复值处理得方法

    python重复值处理得方法

    这篇文章主要介绍了python重复值处理得方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • pygame游戏之旅 添加键盘按键的方法

    pygame游戏之旅 添加键盘按键的方法

    这篇文章主要为大家详细介绍了pygame游戏之旅的第4篇,教大家如何添加键盘按键,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • python属于跨平台语言码

    python属于跨平台语言码

    在本篇文章里小编给大家整理的是关于python是否跨平台的相关知识点文章,有兴趣的朋友们可以参考下。
    2020-06-06

最新评论