def handle_sigterm_at_dbnd_task_run(): def signal_handler(signum, frame): logger.info("Task runner received signal. Exiting...") if is_plugin_enabled("dbnd-docker") and is_plugin_enabled( "dbnd-airflow"): from dbnd_docker.kubernetes.kubernetes_engine_config import ( ENV_DBND_POD_NAME, ) if ENV_DBND_POD_NAME in os.environ: # We are running inside cluster # We should log all events on sigterm for debugging when running inside cluster from dbnd_airflow_contrib.kubernetes_metrics_logger import ( log_pod_events_on_sigterm, ) log_pod_events_on_sigterm(frame) raise DatabandSigTermError("Task received signal", help_msg="Probably the job was canceled") original_sigterm_signal = None try: original_sigterm_signal = safe_signal(signal.SIGTERM, signal_handler) yield finally: if original_sigterm_signal: safe_signal(signal.SIGTERM, original_sigterm_signal)
def preexec_fn(): if windows_compatible_mode: return # Restore default signal disposition and invoke setsid for sig in ("SIGPIPE", "SIGXFZ", "SIGXFSZ"): if hasattr(signal, sig): safe_signal(getattr(signal, sig), signal.SIG_DFL) os.setsid()
def _dbnd_exception_handling(): if windows_compatible_mode: return # Enables graceful shutdown when running inside docker/kubernetes and subprocess shutdown # By default the kill signal is SIGTERM while our code mostly expects SIGINT (KeyboardInterrupt) def sigterm_handler(sig, frame): os.kill(os.getpid(), signal.SIGINT) safe_signal(signal.SIGTERM, sigterm_handler)
def handle_sigterm_at_dbnd_task_run(): def signal_handler(signum, frame): logger.info("Task runner received signal. Exiting...") raise DatabandSigTermError("Task received signal", help_msg="Probably the job was canceled") original_sigterm_signal = None try: original_sigterm_signal = safe_signal(signal.SIGTERM, signal_handler) yield finally: if original_sigterm_signal: safe_signal(signal.SIGTERM, original_sigterm_signal)
def mgr_init(): safe_signal(signal.SIGINT, mgr_sig_handler)