python写的daemon进程

本文介绍了如何使用Python实现后台守护进程,包括初始化、启动、添加子进程、注册信号处理和处理子进程退出的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import sys, os, time, atexit
from signal import SIGTERM
import signal
import subprocess

class Daemon:
    
    def __init__(self, stdin='/dev/null', stdout='/home/workspace/py_server/engine.log', stderr='/dev/null'):
        self.stdin = stdin
        self.stdout = stdout
        self.stderr = stderr
        self.child_map = {}
        
    def _daemonize(self):
        pid = os.fork()
        if (pid > 0):
            sys.exit(0)
        os.setsid()
        os.chdir('/')
        os.umask(0)
        sys.stdout.flush()
        sys.stderr.flush()
        fd0 = file(self.stdin, 'r')
        fd1 = file(self.stdout, 'a+')
        fd2 = file(self.stderr, 'a+', 0)
        os.dup2(fd0.fileno(), sys.stdin.fileno())
        os.dup2(fd1.fileno(), sys.stdout.fileno())
        os.dup2(fd2.fileno(), sys.stderr.fileno())
        
    def start(self):
        self._daemonize()
        signal.signal(signal.SIGCHLD, self._handle_exit)        
        self._run()
           
        
    def _run(self):
        pass
    
    def add_child(self, pid, cmd):
        for pid_,cmd_ in self.child_map.items():
            if cmd_ == cmd:del(self.child_map[pid_])
        self.child_map[pid] = cmd
    
    def register_signal(self, signal_num):
        signal.signal(signal_num, self.handle_signal)
    
    def _handle_exit(self, signal_num, arg):
        pid, state = os.wait()
        self.handle_exit(pid, state)
        
    def handle_exit(self, pid, state):
        pass
        
    def handle_signal(self, signal_num, arg):
        pass
    
    def spawn_child(self, cmd):
        process = subprocess.Popen(cmd, shell=True)
        self.add_child(process.pid, cmd)
    
        
        
写一个数继承Daemon类,重写_run方法,在里面写你的程序体,重写handle_exit方法,子进程退出时可以回调获得退出子进程的ID和退出状态,spawn_child传入字符串命令行,启动子进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值