diff options
Diffstat (limited to 'src/sysexec.c')
-rw-r--r-- | src/sysexec.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/sysexec.c b/src/sysexec.c index abfd6f8..ae9a40c 100644 --- a/src/sysexec.c +++ b/src/sysexec.c @@ -23,6 +23,7 @@ #include <unistd.h> #include <sys/types.h> +#include <sys/signal.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> @@ -252,6 +253,14 @@ int child_list_num_running(child_list_t* list) return num; } +void child_list_kill_oldest(child_list_t* list) +{ + if(!list || !list->first_) + return; + + kill(list->first_->pid_, SIGKILL); +} + int rh_exec(const char* script, char* const argv[], char* const evp[], child_list_t* child_lst, options_t* opt) { if(!script) @@ -262,8 +271,12 @@ int rh_exec(const char* script, char* const argv[], char* const evp[], child_lis return -2; if(child_list_num_running(child_lst) >= opt->max_children_) { - log_printf(INFO, "deferring script execution '%s'", script); - return 0; + switch(opt->children_policy_) { + case DEFER: log_printf(INFO, "children limit reached: deferring script execution '%s'", script); break; + case DROP: log_printf(INFO, "children limit reached: not calling '%s'", script); child_list_rm(child_lst, child); break; + case KILL_OLDEST: log_printf(INFO, "children limit reached: killing oldest child"); child_list_kill_oldest(child_lst); break; + } + return -3; } int ret = rh_exec_child(child); |