![](/img/trans.png)
[英]How to avoid process termination when parent process terminates in python
[英]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天文件的滾動窗口。
這有兩個好處:
大多數腳本語言都有一個小的包裝類,可以用來使cron
更友好。 Ruby的流行之作就是隨時隨地 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.