summaryrefslogtreecommitdiff
path: root/src/sysexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sysexec.c')
-rw-r--r--src/sysexec.c17
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);