python使用fork实现守护进程的方法

当我们希望一些Python代码在后台不断运行,同时保证它不会因为意外情况而终止,比如说退出或崩溃,那么这时候我们通常会使用“守护进程”的方式来达成这个目的。Python的os模块提供了实现守护进程的方法,其中使用fork来创建进程是一种相对简单的实现方式。

1. 使用fork创建守护进程步骤示例

以下是使用fork来创建守护进程步骤示例:

import os, sys

# fork 子进程
pid = os.fork()

# 如果fork出错了,报错并退出程序
if pid < 0:
    sys.exit("fork error")

# 如果是父进程,结束
if pid > 0:
    sys.exit(0)

# 设置새的会话,并且设置进程组id为自己
os.setsid()

# 关闭输入
sys.stdin.close()

# 关闭输出
sys.stdout.close()

# 关闭错误输出
sys.stderr.close()

# 分离所有终端,变成一个真正意义上独立的进程
# 这时候就不会被控制终端以及其他的进程干扰了
# 下面的代码是一些后台运行的代码,可任意编写
while True:
    pass

需要注意的是,这段代码在子进程中运行,将自己分离出控制终端和进程组,变成一个“守护”进程后,即可在后台运行。

2. 完整守护进程示例

以下是一个完整实践守护进程的例子:

import os, sys, time

def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    """
    实现守护进程步骤函数
    """
    try:
        pid = os.fork()
        if pid > 0:
            #退出父进程
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_fork #1 failed: {0}\n'.format(err))
        sys.exit(1)

    #修改当前工作目录
    os.chdir('/')
    #脱离文件输入输出
    os.umask(0)
    os.setsid()

    try:
        pid = os.fork()
        if pid > 0:
            #退出第一个子进程
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_fork #2 failed: {0}\n'.format(err))
        sys.exit(1)

    #将输入输出指向空设备
    sys.stdout.flush()
    sys.stderr.flush()
    si = open(stdin, 'r')
    so = open(stdout, 'a+')
    se = open(stderr, 'w')

    #dup2函数原子化关闭和复制文件描述符
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

    #进入主循环
    while True:
        #这里写守护进程的代码
        time.sleep(10)

if __name__ == '__main__':
    daemonize('/dev/null', '/tmp/daemon_stdout.log', '/tmp/daemon_error.log')

这个函数接受三个文件路径名参数,stdin、stdout以及stderr,分别代表标准输入、标准输出和标准错误输出的文件路径,如果这些参数未指定,则它们将分别指向/dev/null。在这个例子中,daemonize()函数创建了一个守护进程,并在标准输入、标准输出和标准错误输出中记录日志。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python使用fork实现守护进程的方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python逐行读取文件内容的三种方法

    当我们需要处理大型文件时,可能会需要逐行读取文件的内容。Python为我们提供了多种读取文件的方式,以下是Python逐行读取文件内容的三种方法: 1. 使用for循环逐行读取文件内容 with open(‘file.txt’, ‘r’) as f: for line in f: print(line.strip()) 这种方法会一次读取一行,每次循环会返回…

    python 2023年6月5日
    00
  • Python使用Beautiful Soup实现解析网页

    Python使用Beautiful Soup实现解析网页 本文将介绍如何使用Python的Beautiful Soup库解析网页。我们将使用Beautiful Soup库解析HTML文档,并使用find()和find_all()方法查找元素。 解析HTML文档 以下是一个示例代码,演示如何使用Python的Beautiful Soup库解析HTML文档: f…

    python 2023年5月15日
    00
  • python批量导出导入MySQL用户的方法

    下面我将为您详细讲解 python 批量导出、导入 MySQL 用户的方法的完整攻略。 准备工作 在正式开始之前,我们需要进行一些准备工作。 安装必要的库 首先,我们需要安装 mysql-connector-python 库来连接 MySQL 数据库。可以通过以下命令来安装: pip install mysql-connector-python 创建数据库和…

    python 2023年6月3日
    00
  • 详解Python结合Genetic Algorithm算法破解网易易盾拼图验证

    详解Python结合Genetic Algorithm算法破解网易易盾拼图验证 简介 网易易盾拼图验证码是一种常见的人机验证方式,其通过将原图拆分成小拼图,用户需要将拼图正确还原后才能通过验证。本文将介绍如何使用Python结合遗传算法(Genetic Algorithm)破解网易易盾拼图验证。 思路 考虑到网易易盾拼图验证码有多种随机拆分方式,且每次验证的…

    python 2023年5月18日
    00
  • tensorflow 打印内存中的变量方法

    要打印tensorflow内存中的变量,我们需要使用tensorflow的Session类中的run方法。具体代码如下: import tensorflow as tf # 创建一个tensorflow变量x x = tf.Variable(0) # 创建一个操作,将x加1 add_op = tf.assign_add(x, 1) # 创建一个会话 with…

    python 2023年6月3日
    00
  • python内置函数之eval函数详解

    Python内置函数之eval函数详解 在Python中,eval()函数是一个内置函数,它可以将字符串作为代码执行。eval()函数可以帮助我们动态地执行代码,并返回执行结果。本文将详细介绍eval()函数的用法,并提供两个示例。 eval()函数的用法 eval()函数可以将字符串作为代码执行,并返回执行结果。下面是eval()函数的基本用法: resu…

    python 2023年5月15日
    00
  • list集合去除重复对象的实现

    1. 实现去除重复对象 List集合去重的实现方式有很多,最常见的是使用Set数据结构实现。Set能够自动去除重复的元素,因此我们可以先将List集合转换成Set集合,再将Set集合转回List集合即可。 List<Object> list = new ArrayList<>(); // 定义一个包含重复元素的List集合 Set&l…

    python 2023年5月14日
    00
  • python脚本实现数据导出excel格式的简单方法(推荐)

    接下来我将详细讲解“python脚本实现数据导出Excel格式的简单方法(推荐)”实例教程。 1. 简介 本文主要讲解如何使用Python实现将数据导出为Excel格式的简单方法。其中,我们使用第三方库openpyxl来实现数据写入Excel的操作。此外,我们还会介绍pandas库的方式来进行Excel写入。 2. 安装库 首先我们需要安装openpyxl库…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部