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

yizhihongxing

当我们希望一些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中使用NumPy在点x的列表中评估Hermite_e序列

    在Python中使用NumPy评估Hermite_e序列,需要执行以下步骤: 导入NumPy库 在Python中,可以使用以下语句导入NumPy库: import numpy as np 定义Hermite_e函数 Hermite_e函数可以使用以下代码定义: def Hermite_e(x, n): if n == 0: return np.exp(-x*…

    python-answer 2023年3月25日
    00
  • python爬虫请求库httpx和parsel解析库的使用测评

    在Python中,我们可以使用httpx库进行网络请求,使用parsel库进行HTML解析。本文将介绍如何使用httpx和parsel库,并提供两个示例。 1. 使用httpx库进行网络请求 httpx是一个Python的HTTP客户端库,它提供了简单易用的API,支持异步请求和HTTP/2。以下是一个示例,演示如何使用httpx库进行网络请求: impor…

    python 2023年5月15日
    00
  • Python匿名函数详情

    下面是Python匿名函数的详细讲解攻略: 1. 什么是 Python 匿名函数 Python 匿名函数又叫 Lambda函数。Lambda函数是一种快速定义单行的最小函数形式。这种函数能够接收任意多个参数(包括可选参数)并且返回单个表达式的值。 下面是Lambda函数的一般形式: lambda [arg1 [,arg2,…..argn]]:expres…

    python 2023年6月5日
    00
  • JS在IE和FF下attachEvent,addEventListener学习笔记

    下面是关于“JS在IE和FF下attachEvent,addEventListener学习笔记”的完整攻略: 什么是attachEvent、addEventListener? attachEvent和addEventListener都是JavaScript中绑定事件的方法。 attachEvent是IE浏览器下的方法,用于绑定事件。 addEventList…

    python 2023年6月13日
    00
  • Python交互环境下实现输入代码

    要在Python的交互环境下输入代码,需要按照以下步骤进行: 打开Python交互环境; 输入代码; 按下回车键执行代码。 下面是示例说明: 示例1:打印字符串 >>> print(“Hello, World!”) Hello, World! 在Python交互环境中,我们可以直接输入代码 print(“Hello, World!”),然后…

    python 2023年5月31日
    00
  • pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)

    当使用pip安装Twisted时,可能会遇到以下错误: Failed building wheel for Twisted 这是因为pip无法在当前的开发环境中正确安装Twisted。 为了解决这个问题,您需要进行以下步骤: 安装Microsoft Visual C++ Build Tools Twisted需要一些编译工具才能构建成功。在Windows系统…

    python 2023年5月13日
    00
  • 如何利用python turtle绘图自定义画布背景颜色

    讲解如下: 如何利用python turtle绘图自定义画布背景颜色 1. 引入turtle模块 在python代码中引入turtle模块:import turtle 2. 创建一个画布并设置背景颜色 turtle.Screen()可以创建一个画布对象,在对象上进行绘图操作。 绘图时,可以调用bgcolor()方法来设置画布的背景颜色,例如: import …

    python 2023年5月18日
    00
  • Python爬虫图片懒加载技术 selenium和PhantomJS解析

    Python爬虫图片懒加载技术 selenium和PhantomJS解析 本文将介绍如何利用Python爬虫对使用懒加载技术的网页上的图片进行爬取。在这里我将使用selenium和PhantomJS解析器作为我们工具。其中selenium是一个流行的Web自动化测试框架,可以模拟用户在浏览器上的各种操作,而PhantomJS是一个无界面的,基于WebKit的…

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