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

作者:junjie 时间:2022-06-09 16:50:52 

守护进程(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,Linux,守护进程
0
投稿

猜你喜欢

  • anaconda中安装的python环境中没有pip3的问题及解决

    2022-07-19 08:45:34
  • element跨分页操作选择详解

    2023-07-02 16:38:47
  • Golang如何构造最佳随机密码详解

    2024-05-05 09:29:37
  • MySQL IFNULL判空问题解决方案

    2024-01-21 13:23:10
  • GoLang抽奖系统简易实现流程

    2024-04-30 10:02:24
  • PHP join()函数用法与实例讲解

    2023-06-02 00:39:19
  • SQL 查询性能优化 解决书签查找

    2024-01-28 08:33:53
  • vue-cli3项目升级到vue-cli4 的方法总结

    2024-04-27 15:48:50
  • Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统

    2024-01-26 14:46:02
  • PyTorch 中的 torch.utils.data 解析(推荐)

    2021-09-14 01:58:16
  • 画pytorch模型图,以及参数计算的方法

    2023-09-25 09:12:58
  • 表单name与id的区别和相似之处

    2007-12-13 12:55:00
  • 如何利用数据库内容建立一个下拉式列表?

    2010-01-01 15:46:00
  • 利用Python写个简易版星空大战游戏

    2023-08-26 14:07:42
  • 详解pycharm的python包opencv(cv2)无代码提示问题的解决

    2022-01-10 06:45:34
  • 优雅地扩大链接响应区域

    2010-09-25 13:04:00
  • IDEA使用JDBC安装配置jar包连接MySQL数据库

    2024-01-23 17:43:21
  • python爬虫框架scrapy代理中间件掌握学习教程

    2021-03-22 15:34:54
  • vuex 解决报错this.$store.commit is not a function的方法

    2024-05-08 09:34:14
  • 解决go build不去vendor下查找包的问题

    2024-02-04 10:17:25
  • asp之家 网络编程 m.aspxhome.com