I have a Flask app running behind Apache HTTPD. Apache is configured to have multiple child processes.
The Flask app creates a file on the server with the file's name equal to its process ID. The code looks something like this:
import os
@app.before_first_request
def before_first_request():
filename = os.getpid()
with open(filename, 'w') as file:
file.write('Hello')
When the child process is killed/ended/terminated I would like the Flask app to remove this file.
It's not terribly important that removal of a file happens, as these files won't take up much space, so if bizarre errors occur I don't need to handle them. But for normal workflow, I would like to have some cleanup when Apache shuts down the Flask process.
Any idea on the best way to do this?
The best way to add cleanup functionality before graceful termination of a server-controlled Python process (such as a Flask app running in Apache WSGI context, or even better, in Gunicorn behind Apache) is using the atexit
exit handler.
Elaborating on your original example, here's the addition of the exit handler doing the cleanup of .pid
file:
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)
The simplest way would be to handle this outside of the Apache process. There's no guaranteed way that the process will always remove the files (for example, if you restart the apache server mid-request).
The approach I've taken in the past is to use cron
. Write a small script somewhere in your repository and have it executed on a schedule (daily usually works). This script can just clear out all files in the directorty that are older than 24 hours, so you'll always have a rolling window of 1 days worth of files.
This has two benefits:
Most scripting languages have a small wrapper class that can be used to make cron
more friendly. A popular one for Ruby is whenever .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.