Apache终止Flask进程时如何调用函数?

2024-09-27 07:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask应用程序在apachehttpd后面运行。Apache配置为具有多个子进程。在

Flask应用程序在服务器上创建一个文件,文件名等于其进程ID。 代码如下所示:

import os

@app.before_first_request
def before_first_request():
    filename = os.getpid()
    with open(filename, 'w') as file:
        file.write('Hello')

当子进程被终止/结束/终止时,我希望Flask应用程序删除此文件。在

删除一个文件并不十分重要,因为这些文件不会占用太多空间,所以如果发生奇怪的错误,我不需要处理它们。但是对于正常的工作流,我希望在Apache关闭Flask进程时进行一些清理。在

有什么好办法吗?在


Tags: 文件服务器id应用程序flask进程os文件名
2条回答

最简单的方法是在Apache进程之外处理这个问题。无法保证进程始终删除文件(例如,如果重新启动apache服务器mid请求)。在

我过去采用的方法是使用cron。在存储库中的某个地方编写一个小脚本,并按计划执行(通常每天都可以)。此脚本可以清除目录中超过24小时的所有文件,因此您将始终有一个滚动窗口,其中包含1天的文件。在

这有两个好处:

  1. 你可以完全控制脚本,并且可以使用任何你想要的语言。在
  2. 你可以用这些文件做些花哨的事。您可以压缩它们并将它们存储在其他地方、删除它们或对它们执行分析。完全取决于你!在

大多数脚本语言都有一个小包装类,可以用来使cron更友好。Ruby最流行的是whenever。在

在服务器控制的Python进程(例如在apachewsgi上下文中运行的Flask应用程序,或者更好地,在Apache背后的Gunicorn中运行)之前添加清理功能的最佳方法是使用^{}退出处理程序。在

在您的原始示例中,添加了用于清理.pid文件的退出处理程序:

import atexit
import os

filename = '{}.pid'.format(os.getpid())

@app.before_first_request
def before_first_request():
    with open(filename, 'w') as file:
        file.write('Hello')

def cleanup():
    try:
        os.remove(filename)
    except Exception:
        pass

atexit.register(cleanup)

相关问题 更多 >

    热门问题