簡體   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