/* _background_signal_hand - Process daemon-wide signals for the * backup controller */ static void *_background_signal_hand(void *no_data) { int sig, rc; sigset_t set; /* Locks: Write configuration, job, node, and partition */ slurmctld_lock_t config_write_lock = { WRITE_LOCK, WRITE_LOCK, WRITE_LOCK, WRITE_LOCK }; (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); (void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); while (slurmctld_config.shutdown_time == 0) { xsignal_sigset_create(backup_sigarray, &set); rc = sigwait(&set, &sig); if (rc == EINTR) continue; switch (sig) { case SIGINT: /* kill -2 or <CTRL-C> */ case SIGTERM: /* kill -15 */ info("Terminate signal (SIGINT or SIGTERM) received"); slurmctld_config.shutdown_time = time(NULL); slurmctld_shutdown(); return NULL; /* Normal termination */ break; case SIGHUP: /* kill -1 */ info("Reconfigure signal (SIGHUP) received"); /* * XXX - need to shut down the scheduler * plugin, re-read the configuration, and then * restart the (possibly new) plugin. */ lock_slurmctld(config_write_lock); rc = _backup_reconfig(); if (rc) error("_backup_reconfig: %s", slurm_strerror(rc)); else { /* Leave config lock set through this */ _update_cred_key(); } unlock_slurmctld(config_write_lock); break; case SIGABRT: /* abort */ info("SIGABRT received"); slurmctld_config.shutdown_time = time(NULL); slurmctld_shutdown(); dump_core = true; return NULL; /* Normal termination */ break; default: error("Invalid signal (%d) received", sig); } } return NULL; }
/* _signal_handler - Process daemon-wide signals */ static void *_signal_handler(void *no_data) { int rc, sig; int sig_array[] = {SIGINT, SIGTERM, SIGHUP, SIGABRT, SIGUSR2, 0}; sigset_t set; (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); (void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); /* Make sure no required signals are ignored (possibly inherited) */ _default_sigaction(SIGINT); _default_sigaction(SIGTERM); _default_sigaction(SIGHUP); _default_sigaction(SIGABRT); _default_sigaction(SIGUSR2); while (1) { xsignal_sigset_create(sig_array, &set); rc = sigwait(&set, &sig); if (rc == EINTR) continue; switch (sig) { case SIGHUP: /* kill -1 */ info("Reconfigure signal (SIGHUP) received"); reconfig(); break; case SIGINT: /* kill -2 or <CTRL-C> */ case SIGTERM: /* kill -15 */ info("Terminate signal (SIGINT or SIGTERM) received"); shutdown_threads(); return NULL; /* Normal termination */ case SIGABRT: /* abort */ info("SIGABRT received"); abort(); /* Should terminate here */ shutdown_threads(); return NULL; case SIGUSR2: info("Logrotate signal (SIGUSR2) received"); _update_logging(false); break; default: error("Invalid signal (%d) received", sig); } } }