Browse Source

[Fix] Kill spawned processes on termination

pull/1838/head
Vsevolod Stakhov 8 years ago
parent
commit
6e428e84a0
  1. 36
      src/rspamd.c

36
src/rspamd.c

@ -684,19 +684,25 @@ wait_for_workers (gpointer key, gpointer value, gpointer unused)
struct rspamd_worker *w = value;
struct rspamd_main *rspamd_main;
gint res = 0;
gboolean nowait = FALSE;
rspamd_main = w->srv;
if (w->ppid != getpid ()) {
return TRUE;
nowait = TRUE;
}
if (waitpid (w->pid, &res, WNOHANG) <= 0) {
if (nowait || waitpid (w->pid, &res, WNOHANG) <= 0) {
if (term_attempts < 0) {
if (w->cf->worker->flags & RSPAMD_WORKER_KILLABLE) {
msg_warn_main ("terminate worker %s(%P) with SIGKILL",
g_quark_to_string (w->type), w->pid);
kill (w->pid, SIGKILL);
if (kill (w->pid, SIGKILL) == -1) {
if (nowait && errno == ESRCH) {
/* We have actually killed the process */
goto finished;
}
}
}
else {
if (term_attempts > -(TERMINATION_ATTEMPTS * 2)) {
@ -706,6 +712,10 @@ wait_for_workers (gpointer key, gpointer value, gpointer unused)
g_quark_to_string (w->type), w->pid,
(TERMINATION_ATTEMPTS * 2 + term_attempts) / 5);
kill (w->pid, SIGTERM);
if (nowait && errno == ESRCH) {
/* We have actually killed the process */
goto finished;
}
}
}
else {
@ -713,6 +723,10 @@ wait_for_workers (gpointer key, gpointer value, gpointer unused)
"special worker %s(%P) with SIGKILL",
g_quark_to_string (w->type), w->pid);
kill (w->pid, SIGKILL);
if (nowait && errno == ESRCH) {
/* We have actually killed the process */
goto finished;
}
}
}
}
@ -720,11 +734,17 @@ wait_for_workers (gpointer key, gpointer value, gpointer unused)
return FALSE;
}
finished:
msg_info_main ("%s process %P terminated %s",
g_quark_to_string (w->type), w->pid,
WTERMSIG (res) == SIGKILL ? "hardly" : "softly");
event_del (&w->srv_ev);
g_ptr_array_free (w->finish_actions, TRUE);
nowait ? "with no result available" :
(WTERMSIG (res) == SIGKILL ? "hardly" : "softly"));
if (w->srv_pipe[0] != -1) {
event_del (&w->srv_ev);
}
if (w->finish_actions) {
g_ptr_array_free (w->finish_actions, TRUE);
}
REF_RELEASE (w->cf);
g_free (w);
@ -1162,10 +1182,6 @@ main (gint argc, gchar **argv, gchar **env)
rspamd_main->cfg->libs_ctx = rspamd_init_libs ();
memset (&signals, 0, sizeof (struct sigaction));
other_workers = g_array_new (FALSE, TRUE, sizeof (pid_t));
#ifdef WITH_TORCH
/* We don't need multithreaded BLAS mode, disable it by default */
setenv ("OPENBLAS_NUM_THREADS", "1", 0);
#endif
read_cmd_line (&argc, &argv, rspamd_main->cfg);

Loading…
Cancel
Save