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 天的文件。
这有两个好处:
- 您可以完全控制脚本,并且可以使用您想要的任何语言。
- 您可以使用这些文件做一些有趣的事情。您可以压缩它们并将它们存储在别处、删除它们或对它们执行分析。完全取决于您!
大多数脚本语言都有一个小包装器 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)
我在 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 天的文件。
这有两个好处:
- 您可以完全控制脚本,并且可以使用您想要的任何语言。
- 您可以使用这些文件做一些有趣的事情。您可以压缩它们并将它们存储在别处、删除它们或对它们执行分析。完全取决于您!
大多数脚本语言都有一个小包装器 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)