繁体   English   中英

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')

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

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

有关最佳方法的任何想法吗?

在正常终止服务器控制的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)

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

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

这有两个好处:

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

大多数脚本语言都有一个小的包装类,可以用来使cron更友好。 Ruby的流行之作就是随时随地

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM