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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值