python写进程_python写的daemon进程

该博客介绍了一个Python实现的守护进程类,该类能够实现进程的后台运行、子进程的管理和信号处理。通过`_daemonize`方法实现守护进程化,`start`方法启动并监控子进程,当接收到特定信号时,会调用`handle_exit`方法处理子进程的退出情况,提供了一种灵活的进程管理机制。

摘要生成于 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、付费专栏及课程。

余额充值