简体   繁体   中英

How to call a function when Apache terminates a Flask process?

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:

  1. You're in total control of the script, and can use any language you want.
  2. You can do fancy stuff with these files. You can compress them and store them elsewhere, delete them, or perform analytics on them. Entirely up to you!

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.

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