Safe Exit is a Python package that provides functionality to handle graceful process termination. The package allows users to register functions that will be called when the program exits.
Python has a standard module called atexit
that does something similar,
but atexit
cannot handle cases where a program is killed by a signal not handled by Python.
Python only handles the SIGINT signal and does not handle SIGTERM, SIGQUIT, and SIGHUP signals. On Windows, programs can also be killed by SIGBREAK and CTRL_CLOSE_EVENT.
Safe Exit can handle all these signals:
- On POSIX systems:
SIGINT
,SIGTERM
,SIGQUIT
, andSIGHUP
- On Windows:
SIGINT
,SIGTERM
,SIGBREAK
CTRL_CLOSE_EVENT
,CTRL_LOGOFF_EVENT
,CTRL_SHUTDOWN_EVENT
Windows also has CTRL_C_EVENT
and CTRL_BREAK_EVENT
which Python translate to SIGINT
and SIGBREAK
signals, respectively.
On windows, SIGTERM
is implemented only for the current process,
there is no way to send SIGTERM
to other processes.
To install Safe Exit, simply run:
pip install safe-exit
Just register a cleanup function like you would with atexit:
import safe_exit
def cleanup_function():
# Perform cleanup tasks
safe_exit.register(cleanup_function)
The register
function can also be used as a decorator:
@safe_exit.register
def cleanup_function():
# Perform cleanup tasks
Signal handling is configurable.
Call the config
function before registering functions.
The following code configures safe_exit
to handle SIGQUIT and SIGHUP signals:
from safe_exit import ConfigFlag, config, register
config(ConfigFlag.SIGQUIT | ConfigFlag.SIGHUP)
@register
def cleanup()
print("clean up")
To nicely kill a process, giving it a chance to clean up:
process_id = ...
safe_exit.safe_kill(process_pid)
Contributions to Safe Exit are welcome! If you would like to contribute or have any ideas for improvements, please feel free to open an issue on the project's issue tracker or get in touch with the maintainer directly.
Safe Exit is released under the MIT License. See the LICENSE.txt file for more details.