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

How to call a function when Apache terminates a Flask process?

我在 Apache HTTPD 后面有一个 Flask 应用程序 运行。 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')

当子进程 killed/ended/terminated 我希望 Flask 应用程序删除此文件。

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

关于执行此操作的最佳方法有什么想法吗?

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

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

这有两个好处:

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

大多数脚本语言都有一个小包装器 class,可用于使 cron 更加友好。 Ruby 的一个流行的是 whenever.

在正常终止服务器控制的 Python 进程(例如 Apache WSGI 上下文中的 Flask 应用程序 运行 之前添加清理功能的最佳方法,甚至更好,在 Apache 后面的 Gunicorn 中) 正在使用 atexit 退出处理程序。

详细说明您的原始示例,这里添加了执行 .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)