Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRudolfs Kreicbergs <git-no-reply@zabbix.com>2011-07-20 16:01:26 +0400
committerRudolfs Kreicbergs <git-no-reply@zabbix.com>2011-07-20 16:01:26 +0400
commiteb001955c5e424384c969cd31861049a4c8114a7 (patch)
tree376f714baf6d7f638120479480ef6758f79c2daa
parent6b916cad6b1ceb157408ca28b3a283839f5a3bf7 (diff)
- [ZBX-3902] fixed possible zombie states in UNIX, moved watchdog (server) and heartbeats (proxy) to separate processes (main process just waits), added more logging to exiting Windows agent
[Merged from 1.8 r20693]
-rw-r--r--ChangeLog1
-rw-r--r--include/common.h1
-rw-r--r--include/daemon.h7
-rw-r--r--include/threads.h13
-rw-r--r--src/libs/zbxnix/daemon.c132
-rw-r--r--src/libs/zbxsys/threads.c47
-rw-r--r--src/libs/zbxwin32/service.c113
-rw-r--r--src/zabbix_agent/active.c4
-rw-r--r--src/zabbix_agent/listener.c6
-rw-r--r--src/zabbix_agent/stats.c6
-rw-r--r--src/zabbix_agent/zabbix_agentd.c57
-rw-r--r--src/zabbix_proxy/datasender/datasender.c2
-rw-r--r--src/zabbix_proxy/heart/heart.c2
-rw-r--r--src/zabbix_proxy/housekeeper/housekeeper.c2
-rw-r--r--src/zabbix_proxy/proxy.c248
-rw-r--r--src/zabbix_proxy/proxyconfig/proxyconfig.c2
-rw-r--r--src/zabbix_server/alerter/alerter.c2
-rw-r--r--src/zabbix_server/dbconfig/dbconfig.c2
-rw-r--r--src/zabbix_server/dbsyncer/dbsyncer.c2
-rw-r--r--src/zabbix_server/discoverer/discoverer.c2
-rw-r--r--src/zabbix_server/escalator/escalator.c2
-rw-r--r--src/zabbix_server/housekeeper/housekeeper.c2
-rw-r--r--src/zabbix_server/httppoller/httppoller.c2
-rw-r--r--src/zabbix_server/nodewatcher/nodewatcher.c2
-rw-r--r--src/zabbix_server/pinger/pinger.c2
-rw-r--r--src/zabbix_server/poller/poller.c2
-rw-r--r--src/zabbix_server/proxypoller/proxypoller.c2
-rw-r--r--src/zabbix_server/selfmon/selfmon.c2
-rw-r--r--src/zabbix_server/server.c326
-rw-r--r--src/zabbix_server/timer/timer.c2
-rw-r--r--src/zabbix_server/trapper/trapper.c2
-rw-r--r--src/zabbix_server/watchdog/watchdog.c26
32 files changed, 303 insertions, 720 deletions
diff --git a/ChangeLog b/ChangeLog
index 7c66017a42b..b23d5f507e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -177,6 +177,7 @@ New features:
--------------------------------------------------------------------------------
Changes for 1.8.6rc1
+ - [ZBX-3902] fixed possible zombie states in UNIX, moved watchdog (server) and heartbeats (proxy) to separate processes (main process just waits), added more logging to exiting Windows agent (rudolfs)
- [ZBX-3166] fixed application updating in Template linking event. Changed linked Template color in application page. Added param NOEMPTY for popup page witch allows hide Empty button in application and item pages (Eduard)
- [ZBX-3565] reformating media types in notifications page, adding links to media types (Eduard)
- [ZBX-3784] added validation on duplicate discovery rule name (Eduard)
diff --git a/include/common.h b/include/common.h
index b792f8109a7..b9ad062499e 100644
--- a/include/common.h
+++ b/include/common.h
@@ -21,7 +21,6 @@
#define ZABBIX_COMMON_H
#include "sysinc.h"
-
#include "zbxtypes.h"
#ifdef DEBUG
diff --git a/include/daemon.h b/include/daemon.h
index 17b48344520..e18eab18ad6 100644
--- a/include/daemon.h
+++ b/include/daemon.h
@@ -22,7 +22,7 @@
#if defined(_WINDOWS)
# error "This module allowed only for Unix OS"
-#endif /* _WINDOWS */
+#endif
#define USE_PID_FILE 1
@@ -33,9 +33,6 @@ extern char *CONFIG_PID_FILE;
int daemon_start(int allow_root);
void daemon_stop();
-void set_parent_signal_handler();
-void set_child_signal_handler();
-
int zbx_sigusr_send(zbx_task_t task);
#define ZBX_IS_RUNNING() 1
@@ -43,4 +40,4 @@ int zbx_sigusr_send(zbx_task_t task);
#define START_MAIN_ZABBIX_ENTRY(a) daemon_start(a)
-#endif /* ZABBIX_DAEMON_H */
+#endif /* ZABBIX_DAEMON_H */
diff --git a/include/threads.h b/include/threads.h
index 82d4019b371..7a65b3d0133 100644
--- a/include/threads.h
+++ b/include/threads.h
@@ -24,10 +24,10 @@
#if defined(_WINDOWS)
- #define ZBX_THREAD_ERROR 0
+ #define ZBX_THREAD_ERROR 0
- #define ZBX_THREAD_HANDLE HANDLE
- #define ZBX_THREAD_HANDLE_NULL NULL
+ #define ZBX_THREAD_HANDLE HANDLE
+ #define ZBX_THREAD_HANDLE_NULL NULL
#define ZBX_THREAD_ENTRY_POINTER(pointer_name) \
unsigned (__stdcall *pointer_name)(void *)
@@ -46,11 +46,12 @@
#else /* not _WINDOWS */
int zbx_fork();
+ int zbx_child_fork();
- #define ZBX_THREAD_ERROR (-1)
+ #define ZBX_THREAD_ERROR -1
- #define ZBX_THREAD_HANDLE pid_t
- #define ZBX_THREAD_HANDLE_NULL 0
+ #define ZBX_THREAD_HANDLE pid_t
+ #define ZBX_THREAD_HANDLE_NULL 0
#define ZBX_THREAD_ENTRY_POINTER(pointer_name) \
unsigned (* pointer_name)(void *)
diff --git a/src/libs/zbxnix/daemon.c b/src/libs/zbxnix/daemon.c
index b84dce892ad..5737144dee8 100644
--- a/src/libs/zbxnix/daemon.c
+++ b/src/libs/zbxnix/daemon.c
@@ -28,13 +28,12 @@
#include "fatal.h"
char *CONFIG_PID_FILE = NULL;
-
-static int parent = 0;
static int parent_pid = -1;
static int exiting = 0;
#define CHECKED_FIELD(siginfo, field) (NULL == siginfo ? -1 : siginfo->field)
#define CHECKED_FIELD_TYPE(siginfo, field, type) (NULL == siginfo ? (type)-1 : siginfo->field)
+#define PARENT_PROCESS (parent_pid == (int)getpid())
static void child_signal_handler(int sig, siginfo_t *siginfo, void *context)
{
@@ -73,42 +72,41 @@ static void child_signal_handler(int sig, siginfo_t *siginfo, void *context)
CHECKED_FIELD(siginfo, si_uid),
CHECKED_FIELD(siginfo, si_value.sival_int));
#ifdef HAVE_SIGQUEUE
- if (1 == parent)
+ if (!PARENT_PROCESS)
+ {
+ extern void zbx_sigusr_handler(zbx_task_t task);
+
+ zbx_sigusr_handler(CHECKED_FIELD(siginfo, si_value.sival_int));
+ }
+ else if (ZBX_TASK_CONFIG_CACHE_RELOAD == CHECKED_FIELD(siginfo, si_value.sival_int))
{
- if (ZBX_TASK_CONFIG_CACHE_RELOAD == CHECKED_FIELD(siginfo, si_value.sival_int))
+ extern unsigned char daemon_type;
+
+ if (0 != (daemon_type & ZBX_DAEMON_TYPE_PROXY_PASSIVE))
{
- extern unsigned char daemon_type;
+ zabbix_log(LOG_LEVEL_WARNING, "forced reloading of the configuration cache"
+ " cannot be performed for a passive proxy");
+ }
+ else
+ {
+ union sigval s;
+ extern pid_t *threads;
- if (0 != (daemon_type & ZBX_DAEMON_TYPE_PROXY_PASSIVE))
+ s.sival_int = ZBX_TASK_CONFIG_CACHE_RELOAD;
+
+ /* threads[0] is configuration syncer (it is set in proxy.c and server.c) */
+ if (-1 != sigqueue(threads[0], SIGUSR1, s))
{
- zabbix_log(LOG_LEVEL_WARNING, "forced reloading of the"
- " configuration cache cannot be"
- " performed for passive proxy");
+ zabbix_log(LOG_LEVEL_DEBUG, "the signal is redirected to"
+ " the configuration syncer");
}
else
{
- union sigval s;
- extern pid_t *threads;
-
- s.sival_int = ZBX_TASK_CONFIG_CACHE_RELOAD;
-
- if (-1 != sigqueue(threads[1], SIGUSR1, s))
- zabbix_log(LOG_LEVEL_DEBUG,
- "the signal is redirected to"
- " the configuration syncer");
- else
- zabbix_log(LOG_LEVEL_ERR,
- "failed to redirect signal: %s",
- zbx_strerror(errno));
+ zabbix_log(LOG_LEVEL_ERR, "failed to redirect signal: %s",
+ zbx_strerror(errno));
}
}
}
- else
- {
- extern void zbx_sigusr_handler(zbx_task_t task);
-
- zbx_sigusr_handler(CHECKED_FIELD(siginfo, si_value.sival_int));
- }
#endif
break;
case SIGQUIT:
@@ -121,16 +119,15 @@ static void child_signal_handler(int sig, siginfo_t *siginfo, void *context)
CHECKED_FIELD(siginfo, si_uid),
CHECKED_FIELD(siginfo, si_code));
- if (1 == parent)
+ if (!PARENT_PROCESS)
+ exit(FAIL);
+
+ if (0 == exiting)
{
- if (0 == exiting)
- {
- exiting = 1;
- zbx_on_exit();
- }
+ exiting = 1;
+ zbx_on_exit();
}
- else
- exit(FAIL);
+
break;
case SIGPIPE:
zabbix_log(LOG_LEVEL_DEBUG, "Got signal [signal:%d(%s),sender_pid:%d]. Ignoring ...",
@@ -150,29 +147,17 @@ static void parent_signal_handler(int sig, siginfo_t *siginfo, void *context)
switch (sig)
{
case SIGCHLD:
- if (1 == parent)
- {
- if (0 == exiting)
- {
- int i, found = 0;
- extern int threads_num;
- extern pid_t *threads;
-
- for (i = 1; i < threads_num && !found; i++)
- found = (threads[i] == CHECKED_FIELD(siginfo, si_pid));
-
- if (0 == found) /* we should not worry too much about non-Zabbix child */
- return; /* processes, like watchdog alert scripts, terminating */
+ if (!PARENT_PROCESS)
+ exit(FAIL);
- zabbix_log(LOG_LEVEL_CRIT, "One child process died (PID:%d,exitcode/signal:%d). Exiting ...",
- CHECKED_FIELD(siginfo, si_pid),
- CHECKED_FIELD(siginfo, si_status));
- exiting = 1;
- zbx_on_exit();
- }
+ if (0 == exiting)
+ {
+ zabbix_log(LOG_LEVEL_CRIT, "One child process died (PID:%d,exitcode/signal:%d). Exiting ...",
+ CHECKED_FIELD(siginfo, si_pid), CHECKED_FIELD(siginfo, si_status));
+ exiting = 1;
+ zbx_on_exit();
}
- else
- exit(FAIL);
+
break;
default:
child_signal_handler(sig, siginfo, context);
@@ -276,14 +261,19 @@ int daemon_start(int allow_root)
sigaction(SIGQUIT, &phan, NULL);
sigaction(SIGTERM, &phan, NULL);
sigaction(SIGPIPE, &phan, NULL);
-
sigaction(SIGILL, &phan, NULL);
sigaction(SIGFPE, &phan, NULL);
sigaction(SIGSEGV, &phan, NULL);
sigaction(SIGBUS, &phan, NULL);
-
+ sigaction(SIGALRM, &phan, NULL);
sigaction(SIGUSR1, &phan, NULL);
+ /* Set SIGCHLD now to avoid race conditions when a child process is created before */
+ /* sigaction() is called. To avoid problems when scripts exit in zbx_execute() and */
+ /* other cases, SIGCHLD is set to SIG_IGN in zbx_child_fork(). */
+ phan.sa_sigaction = parent_signal_handler;
+ sigaction(SIGCHLD, &phan, NULL);
+
zbx_setproctitle("main process");
return MAIN_ZABBIX_ENTRY();
@@ -300,28 +290,6 @@ void daemon_stop()
drop_pid_file(CONFIG_PID_FILE);
}
-void set_parent_signal_handler()
-{
- struct sigaction phan;
-
- parent = 1; /* signalize signal handler that this process is a PARENT process */
-
- phan.sa_sigaction = parent_signal_handler;
- sigemptyset(&phan.sa_mask);
- phan.sa_flags = SA_SIGINFO;
- sigaction(SIGCHLD, &phan, NULL); /* for parent only, to avoid problems with EXECUTE_INT/DBL/STR and others */
-}
-
-void set_child_signal_handler()
-{
- struct sigaction phan;
-
- phan.sa_sigaction = child_signal_handler;
- sigemptyset(&phan.sa_mask);
- phan.sa_flags = SA_SIGINFO;
- sigaction(SIGALRM, &phan, NULL);
-}
-
int zbx_sigusr_send(zbx_task_t task)
{
int ret = FAIL;
@@ -341,8 +309,10 @@ int zbx_sigusr_send(zbx_task_t task)
ret = SUCCEED;
}
else
+ {
zbx_snprintf(error, sizeof(error), "cannot send command to PID [%d]: %s",
(int)pid, zbx_strerror(errno));
+ }
}
#else
zbx_snprintf(error, sizeof(error), "operation is not supported on the given operating system");
diff --git a/src/libs/zbxsys/threads.c b/src/libs/zbxsys/threads.c
index 8ce1f859587..ef2245b9ef0 100644
--- a/src/libs/zbxsys/threads.c
+++ b/src/libs/zbxsys/threads.c
@@ -18,33 +18,53 @@
**/
#include "common.h"
+#include "log.h"
#include "threads.h"
-#include "log.h" /* required for strerror_from_system() on Windows */
-
+#if !defined(_WINDOWS)
/******************************************************************************
* *
* Function: zbx_fork *
* *
* Purpose: Flush stdout and stderr before forking *
* *
- * Parameters: *
- * *
- * Return value: same as system fork function *
+ * Return value: same as system fork() function *
* *
* Author: Eugene Grigorjev *
* *
- * Comments: *
- * Use this function instead of system fork function! *
- * *
******************************************************************************/
-#if !defined(_WINDOWS)
int zbx_fork()
{
fflush(stdout);
fflush(stderr);
return fork();
}
+
+/******************************************************************************
+ * *
+ * Function: zbx_child_fork *
+ * *
+ * Purpose: fork from master process and set SIGCHLD handler *
+ * *
+ * Return value: same as system fork() function *
+ * *
+ * Author: Rudolfs Kreicbergs *
+ * *
+ * Comments: use this function only for forks from the main process *
+ * *
+ ******************************************************************************/
+int zbx_child_fork()
+{
+ pid_t pid;
+
+ pid = zbx_fork();
+
+ /* ignore SIGCHLD to avoid problems with exiting scripts in zbx_execute() and other cases */
+ if (0 == pid)
+ signal(SIGCHLD, SIG_IGN);
+
+ return pid;
+}
#endif
/******************************************************************************
@@ -60,8 +80,7 @@ int zbx_fork()
* *
* Author: Eugene Grigorjev *
* *
- * Comments: *
- * The zbx_thread_exit must be called from the handler! *
+ * Comments: The zbx_thread_exit must be called from the handler! *
* *
******************************************************************************/
ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), zbx_thread_args_t *thread_args)
@@ -80,7 +99,7 @@ ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), zbx_thread
#else
- if (0 == (thread = zbx_fork())) /* child process */
+ if (0 == (thread = zbx_child_fork())) /* child process */
{
(*handler)(thread_args);
@@ -111,12 +130,10 @@ ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), zbx_thread
* *
* Author: Eugene Grigorjev *
* *
- * Comments: *
- * *
******************************************************************************/
int zbx_thread_wait(ZBX_THREAD_HANDLE thread)
{
- int status = 0; /* significant 8 bits of the status */
+ int status = 0; /* significant 8 bits of the status */
#ifdef _WINDOWS
diff --git a/src/libs/zbxwin32/service.c b/src/libs/zbxwin32/service.c
index e1ffe6366ff..bb308f2d421 100644
--- a/src/libs/zbxwin32/service.c
+++ b/src/libs/zbxwin32/service.c
@@ -28,10 +28,6 @@
#define EVENTLOG_REG_PATH TEXT("SYSTEM\\CurrentControlSet\\Services\\EventLog\\")
-/*
- * Static data
- */
-
static SERVICE_STATUS serviceStatus;
static SERVICE_STATUS_HANDLE serviceHandle;
@@ -49,13 +45,8 @@ static void parent_signal_handler(int sig)
}
}
-/*
- * Zabbix service control handler
- */
static VOID WINAPI ServiceCtrlHandler(DWORD ctrlCode)
{
- int do_exit = 0;
-
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = SERVICE_RUNNING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
@@ -68,19 +59,24 @@ static VOID WINAPI ServiceCtrlHandler(DWORD ctrlCode)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
+ zabbix_log(LOG_LEVEL_INFORMATION, "Zabbix Agent shutdown requested");
+
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
serviceStatus.dwWaitHint = 4000;
- SetServiceStatus(serviceHandle,&serviceStatus);
+ SetServiceStatus(serviceHandle, &serviceStatus);
+ /* notify other threads and allow them to terminate */
ZBX_DO_EXIT();
-
- /* Allow other threads to terminate */
zbx_sleep(1);
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWaitHint = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWin32ExitCode = 0;
+
+ zabbix_log(LOG_LEVEL_INFORMATION, "Zabbix Agent stopped. Zabbix %s (revision %s).",
+ ZABBIX_VERSION, ZABBIX_REVISION);
+
break;
default:
break;
@@ -89,9 +85,6 @@ static VOID WINAPI ServiceCtrlHandler(DWORD ctrlCode)
SetServiceStatus(serviceHandle, &serviceStatus);
}
-/*
- * The entry point for a Zabbix service.
- */
static VOID WINAPI ServiceEntry(DWORD argc, LPTSTR *argv)
{
LPTSTR wservice_name;
@@ -100,7 +93,7 @@ static VOID WINAPI ServiceEntry(DWORD argc, LPTSTR *argv)
serviceHandle = RegisterServiceCtrlHandler(wservice_name, ServiceCtrlHandler);
zbx_free(wservice_name);
- /* Now we start service initialization */
+ /* start service initialization */
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
@@ -111,7 +104,7 @@ static VOID WINAPI ServiceEntry(DWORD argc, LPTSTR *argv)
SetServiceStatus(serviceHandle, &serviceStatus);
- /* Now service is running */
+ /* service is running */
serviceStatus.dwCurrentState = SERVICE_RUNNING;
serviceStatus.dwWaitHint = 0;
SetServiceStatus(serviceHandle, &serviceStatus);
@@ -119,10 +112,6 @@ static VOID WINAPI ServiceEntry(DWORD argc, LPTSTR *argv)
MAIN_ZABBIX_ENTRY();
}
-
-/*
- * Initialize service
- */
void service_start()
{
int ret;
@@ -148,22 +137,16 @@ void service_start()
}
}
-/*
- * Establishes a connection to the service control manager
- */
static int svc_OpenSCManager(SC_HANDLE *mgr)
{
if (NULL != (*mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE)))
return SUCCEED;
- zbx_error("ERROR: Cannot connect to Service Manager: %s", strerror_from_system(GetLastError()));
+ zbx_error("ERROR: cannot connect to Service Manager: %s", strerror_from_system(GetLastError()));
return FAIL;
}
-/*
- * Opens an existing service
- */
static int svc_OpenService(SC_HANDLE mgr, SC_HANDLE *service, DWORD desired_access)
{
LPTSTR wservice_name;
@@ -173,7 +156,7 @@ static int svc_OpenService(SC_HANDLE mgr, SC_HANDLE *service, DWORD desired_acce
if (NULL == (*service = OpenService(mgr, wservice_name, desired_access)))
{
- zbx_error("ERROR: Cannot open service named \"%s\" [%s]",
+ zbx_error("ERROR: cannot open service [%s]: %s",
ZABBIX_SERVICE_NAME, strerror_from_system(GetLastError()));
ret = FAIL;
}
@@ -192,9 +175,6 @@ static void svc_get_fullpath(const char *path, LPTSTR fullpath, size_t max_fullp
zbx_free(wpath);
}
-/*
- * Create command line
- */
static void svc_get_command_line(const char *path, int multiple_agents, LPTSTR cmdLine, size_t max_cmdLine)
{
TCHAR path1[MAX_PATH], path2[MAX_PATH];
@@ -206,9 +186,7 @@ static void svc_get_command_line(const char *path, int multiple_agents, LPTSTR c
else
zbx_wsnprintf(path1, MAX_PATH, path2);
- if (NULL == CONFIG_FILE)
- zbx_wsnprintf(cmdLine, max_cmdLine, TEXT("\"%s\""), path1);
- else
+ if (NULL != CONFIG_FILE)
{
svc_get_fullpath(CONFIG_FILE, path2, MAX_PATH);
zbx_wsnprintf(cmdLine, max_cmdLine, TEXT("\"%s\" %s--config \"%s\""),
@@ -216,11 +194,10 @@ static void svc_get_command_line(const char *path, int multiple_agents, LPTSTR c
(0 == multiple_agents) ? TEXT("") : TEXT("--multiple-agents "),
path2);
}
+ else
+ zbx_wsnprintf(cmdLine, max_cmdLine, TEXT("\"%s\""), path1);
}
-/*
- * Install event source
- */
static int svc_install_event_source(const char *path)
{
HKEY hKey;
@@ -237,7 +214,7 @@ static int svc_install_event_source(const char *path)
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_LOCAL_MACHINE, regkey, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE, NULL, &hKey, NULL))
{
- zbx_error("Unable to create registry key [%s]", strerror_from_system(GetLastError()));
+ zbx_error("unable to create registry key: %s", strerror_from_system(GetLastError()));
return FAIL;
}
@@ -246,17 +223,14 @@ static int svc_install_event_source(const char *path)
(DWORD)(zbx_strlen(execName) + 1) * sizeof(TCHAR));
RegCloseKey(hKey);
- zbx_error("Event source \"%s\" installed successfully.", ZABBIX_EVENT_SOURCE);
+ zbx_error("event source [%s] installed successfully", ZABBIX_EVENT_SOURCE);
return SUCCEED;
}
-/*
- * Create service
- */
int ZabbixCreateService(const char *path, int multiple_agents)
{
-#define MAX_CMD_LEN MAX_PATH*2
+#define MAX_CMD_LEN MAX_PATH * 2
SC_HANDLE mgr, service;
SERVICE_DESCRIPTION sd;
@@ -276,23 +250,22 @@ int ZabbixCreateService(const char *path, int multiple_agents)
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, cmdLine, NULL, NULL, NULL, NULL, NULL)))
{
if (ERROR_SERVICE_EXISTS == (code = GetLastError()))
- zbx_error("ERROR: Service named \"%s\" already exists", ZABBIX_SERVICE_NAME);
+ zbx_error("ERROR: service [%s] already exists", ZABBIX_SERVICE_NAME);
else
- zbx_error("ERROR: Cannot create service named \"%s\" [%s]",
- ZABBIX_SERVICE_NAME, strerror_from_system(code));
+ zbx_error("ERROR: cannot create service [%s]: %s", ZABBIX_SERVICE_NAME, strerror_from_system(code));
}
else
{
- zbx_error("Service \"%s\" installed successfully.", ZABBIX_SERVICE_NAME);
+ zbx_error("service [%s] installed successfully", ZABBIX_SERVICE_NAME);
CloseServiceHandle(service);
ret = SUCCEED;
- /* Updates the service description */
+ /* update the service description */
if (SUCCEED == svc_OpenService(mgr, &service, SERVICE_CHANGE_CONFIG))
{
sd.lpDescription = TEXT("Provides system monitoring");
if (0 == ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &sd))
- zbx_error("Service description update failed [%s]", strerror_from_system(GetLastError()));
+ zbx_error("service description update failed: %s", strerror_from_system(GetLastError()));
CloseServiceHandle(service);
}
}
@@ -307,9 +280,6 @@ int ZabbixCreateService(const char *path, int multiple_agents)
return ret;
}
-/*
- * Remove event source
- */
static int svc_RemoveEventSource()
{
TCHAR regkey[256];
@@ -322,19 +292,18 @@ static int svc_RemoveEventSource()
if (ERROR_SUCCESS == RegDeleteKey(HKEY_LOCAL_MACHINE, regkey))
{
- zbx_error("Event source \"%s\" uninstalled successfully.", ZABBIX_EVENT_SOURCE);
+ zbx_error("event source [%s] uninstalled successfully", ZABBIX_EVENT_SOURCE);
ret = SUCCEED;
}
else
- zbx_error("Unable to uninstall event source \"%s\" [%s]",
+ {
+ zbx_error("unable to uninstall event source [%s]: %s",
ZABBIX_EVENT_SOURCE, strerror_from_system(GetLastError()));
+ }
return SUCCEED;
}
-/*
- * Remove service
- */
int ZabbixRemoveService()
{
SC_HANDLE mgr, service;
@@ -347,12 +316,14 @@ int ZabbixRemoveService()
{
if (0 != DeleteService(service))
{
- zbx_error("Service \"%s\" uninstalled successfully", ZABBIX_SERVICE_NAME);
+ zbx_error("service [%s] uninstalled successfully", ZABBIX_SERVICE_NAME);
ret = SUCCEED;
}
else
- zbx_error("ERROR: Cannot remove service named \"%s\" [%s]",
+ {
+ zbx_error("ERROR: cannot remove service [%s]: %s",
ZABBIX_SERVICE_NAME, strerror_from_system(GetLastError()));
+ }
CloseServiceHandle(service);
}
@@ -365,9 +336,6 @@ int ZabbixRemoveService()
return ret;
}
-/*
- * Start service
- */
int ZabbixStartService()
{
SC_HANDLE mgr, service;
@@ -380,12 +348,14 @@ int ZabbixStartService()
{
if (0 != StartService(service, 0, NULL))
{
- zbx_error("Service \"%s\" started successfully.", ZABBIX_SERVICE_NAME);
+ zbx_error("service [%s] started successfully", ZABBIX_SERVICE_NAME);
ret = SUCCEED;
}
else
- zbx_error("ERROR: Cannot start service named \"%s\" [%s]",
+ {
+ zbx_error("ERROR: cannot start service [%s]: %s",
ZABBIX_SERVICE_NAME, strerror_from_system(GetLastError()));
+ }
CloseServiceHandle(service);
}
@@ -395,9 +365,6 @@ int ZabbixStartService()
return ret;
}
-/*
- * Stop service
- */
int ZabbixStopService()
{
SC_HANDLE mgr, service;
@@ -411,12 +378,14 @@ int ZabbixStopService()
{
if (0 != ControlService(service, SERVICE_CONTROL_STOP, &status))
{
- zbx_error("Service \"%s\" stopped successfully.", ZABBIX_SERVICE_NAME);
+ zbx_error("service [%s] stopped successfully", ZABBIX_SERVICE_NAME);
ret = SUCCEED;
}
else
- zbx_error("ERROR: Cannot stop service named \"%s\" [%s]",
+ {
+ zbx_error("ERROR: cannot stop service [%s]: %s",
ZABBIX_SERVICE_NAME, strerror_from_system(GetLastError()));
+ }
CloseServiceHandle(service);
}
@@ -428,6 +397,6 @@ int ZabbixStopService()
void set_parent_signal_handler()
{
- signal( SIGINT, parent_signal_handler);
- signal( SIGTERM, parent_signal_handler );
+ signal(SIGINT, parent_signal_handler);
+ signal(SIGTERM, parent_signal_handler);
}
diff --git a/src/zabbix_agent/active.c b/src/zabbix_agent/active.c
index 1f7dffd93fd..c88bc49a5ee 100644
--- a/src/zabbix_agent/active.c
+++ b/src/zabbix_agent/active.c
@@ -1123,10 +1123,6 @@ ZBX_THREAD_ENTRY(active_checks_thread, args)
zbx_free(args);
-#ifdef ZABBIX_DAEMON
- set_child_signal_handler();
-#endif
-
if (NULL != (p = strchr(activechk_args.host, ',')))
*p = '\0';
diff --git a/src/zabbix_agent/listener.c b/src/zabbix_agent/listener.c
index b33ea83e6ba..a7472f305d8 100644
--- a/src/zabbix_agent/listener.c
+++ b/src/zabbix_agent/listener.c
@@ -79,17 +79,13 @@ ZBX_THREAD_ENTRY(listener_thread, args)
zbx_free(args);
-#ifdef ZABBIX_DAEMON
- set_child_signal_handler();
-#endif
-
while (ZBX_IS_RUNNING())
{
zbx_setproctitle("listener [waiting for connection]");
if (SUCCEED == (ret = zbx_tcp_accept(&s)))
{
- local_request_failed = 0; /* Reset consecutive errors counter */
+ local_request_failed = 0; /* reset consecutive errors counter */
zbx_setproctitle("listener [processing request]");
zabbix_log(LOG_LEVEL_DEBUG, "Processing request.");
diff --git a/src/zabbix_agent/stats.c b/src/zabbix_agent/stats.c
index cc15b7277f1..c2c9220f693 100644
--- a/src/zabbix_agent/stats.c
+++ b/src/zabbix_agent/stats.c
@@ -247,10 +247,6 @@ ZBX_THREAD_ENTRY(collector_thread, args)
zbx_free(args);
-#ifdef ZABBIX_DAEMON
- set_child_signal_handler();
-#endif
-
if (SUCCEED != init_cpu_collector(&(collector->cpus)))
free_cpu_collector(&(collector->cpus));
@@ -278,7 +274,7 @@ ZBX_THREAD_ENTRY(collector_thread, args)
#ifdef _WINDOWS
free_perf_collector(); /* cpu_collector must be freed before perf_collector is freed */
-#endif /* _WINDOWS */
+#endif
zabbix_log(LOG_LEVEL_INFORMATION, "zabbix_agentd collector stopped");
diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c
index e54a70016b8..190551b3123 100644
--- a/src/zabbix_agent/zabbix_agentd.c
+++ b/src/zabbix_agent/zabbix_agentd.c
@@ -418,6 +418,9 @@ int MAIN_ZABBIX_ENTRY()
ZBX_THREAD_ACTIVECHK_ARGS activechk_args;
zbx_sock_t listen_sock;
int i, thread_num = 0;
+#ifdef _WINDOWS
+ DWORD res;
+#endif
if (NULL == CONFIG_LOG_FILE || '\0' == *CONFIG_LOG_FILE)
zabbix_open_log(LOG_TYPE_SYSLOG, CONFIG_LOG_LEVEL, NULL);
@@ -451,15 +454,15 @@ int MAIN_ZABBIX_ENTRY()
if (1 == CONFIG_DISABLE_PASSIVE)
{
- /* Only main process and active checks will be started */
- CONFIG_ZABBIX_FORKS = 0;/* Listeners won't be needed for passive checks. */
+ /* only main process and active checks will be started */
+ CONFIG_ZABBIX_FORKS = 0; /* listeners are not needed for passive checks */
}
- /* Allocate memory for a collector, all listeners and an active check. */
+ /* allocate memory for a collector, all listeners and an active check */
threads_num = 1 + CONFIG_ZABBIX_FORKS + (0 == CONFIG_DISABLE_ACTIVE ? 1 : 0);
threads = calloc(threads_num, sizeof(ZBX_THREAD_HANDLE));
- /* Start the collector thread. */
+ /* start the collector thread */
thread_args = (zbx_thread_args_t *)zbx_malloc(NULL, sizeof(zbx_thread_args_t));
thread_args->thread_num = thread_num;
thread_args->args = NULL;
@@ -486,20 +489,36 @@ int MAIN_ZABBIX_ENTRY()
threads[thread_num++] = zbx_thread_start(active_checks_thread, thread_args);
}
- /* Must be called after all child processes loading. */
- set_parent_signal_handler();
+#ifdef _WINDOWS
+ set_parent_signal_handler(); /* must be called after all threads are created */
+
+ /* wait for an exiting thread */
+ res = WaitForMultipleObjectsEx(threads_num, threads, FALSE, INFINITE, FALSE);
- /* wait for all threads exiting */
- for (i = 0; i < 1 + CONFIG_ZABBIX_FORKS + (0 == CONFIG_DISABLE_ACTIVE ? 1 : 0); i++)
+ if (ZBX_IS_RUNNING())
{
- if (threads[i])
- {
- zbx_thread_wait(threads[i]);
- zabbix_log(LOG_LEVEL_DEBUG, "thread [%d] has terminated", i);
+ /* Zabbix agent service should either be stopped by the user in ServiceCtrlHandler() or */
+ /* crash. If some thread has terminated normally, it means something is terribly wrong. */
- ZBX_DO_EXIT();
- }
+ zabbix_log(LOG_LEVEL_CRIT, "One thread has terminated unexpectedly (code:%lu). Exiting ...", res);
+ THIS_SHOULD_NEVER_HAPPEN;
+
+ /* notify other threads and allow them to terminate */
+ ZBX_DO_EXIT();
+ zbx_sleep(1);
+ }
+ else
+ {
+ /* wait for the service worker thread to terminate us */
+ zbx_sleep(2);
+ THIS_SHOULD_NEVER_HAPPEN;
}
+#else
+ wait(&i);
+
+ /* all exiting child processes should be caught by signal handlers */
+ THIS_SHOULD_NEVER_HAPPEN;
+#endif
zbx_on_exit();
@@ -510,21 +529,19 @@ void zbx_on_exit()
{
zabbix_log(LOG_LEVEL_DEBUG, "zbx_on_exit() called");
- ZBX_DO_EXIT();
-
if (NULL != threads)
{
int i;
#if !defined(_WINDOWS)
sigset_t set;
- /* ignore SIGCHLD signals in order for zbx_sleep() to work */
+ /* ignore SIGCHLD signals in order for zbx_sleep() to work */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);
#endif
- for (i = 0; i < 1 + CONFIG_ZABBIX_FORKS + (0 == CONFIG_DISABLE_ACTIVE ? 1 : 0); i++)
+ for (i = 0; i < threads_num; i++)
{
if (threads[i])
{
@@ -536,7 +553,9 @@ void zbx_on_exit()
zbx_free(threads);
}
- zbx_sleep(2); /* wait for all threads closing */
+#if !defined(_WINDOWS)
+ zbx_sleep(2); /* wait for all processes to exit */
+#endif
zabbix_log(LOG_LEVEL_INFORMATION, "Zabbix Agent stopped. Zabbix %s (revision %s).",
ZABBIX_VERSION, ZABBIX_REVISION);
diff --git a/src/zabbix_proxy/datasender/datasender.c b/src/zabbix_proxy/datasender/datasender.c
index 386c8608f8f..1116a966b25 100644
--- a/src/zabbix_proxy/datasender/datasender.c
+++ b/src/zabbix_proxy/datasender/datasender.c
@@ -249,8 +249,6 @@ void main_datasender_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_datasender_loop()");
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_proxy/heart/heart.c b/src/zabbix_proxy/heart/heart.c
index a6c9379f988..470d0d85d5e 100644
--- a/src/zabbix_proxy/heart/heart.c
+++ b/src/zabbix_proxy/heart/heart.c
@@ -84,8 +84,6 @@ void main_heart_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_heart_loop()");
- set_child_signal_handler();
-
for (;;)
{
start = time(NULL);
diff --git a/src/zabbix_proxy/housekeeper/housekeeper.c b/src/zabbix_proxy/housekeeper/housekeeper.c
index 4873e8d4e7e..971a475222e 100644
--- a/src/zabbix_proxy/housekeeper/housekeeper.c
+++ b/src/zabbix_proxy/housekeeper/housekeeper.c
@@ -142,8 +142,6 @@ void main_housekeeper_loop()
int start, sleeptime;
double sec;
- set_child_signal_handler();
-
for (;;)
{
start = time(NULL);
diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c
index 314db10cb67..58c2abda619 100644
--- a/src/zabbix_proxy/proxy.c
+++ b/src/zabbix_proxy/proxy.c
@@ -47,6 +47,12 @@
#include "heart/heart.h"
#include "../zabbix_server/selfmon/selfmon.h"
+#define INIT_PROXY(type, count) \
+ process_type = type; \
+ process_num = proxy_num - proxy_count + count; \
+ zabbix_log(LOG_LEVEL_INFORMATION, "proxy #%d started [%s #%d]", \
+ proxy_num, get_process_type_string(process_type), process_num)
+
const char *progname = NULL;
const char title_message[] = "Zabbix Proxy";
const char usage_message[] = "[-hV] [-c <file>] [-R <option>]";
@@ -510,7 +516,7 @@ int MAIN_ZABBIX_ENTRY()
{
pid_t pid;
zbx_sock_t listen_sock;
- int i, server_num = 0;
+ int i, proxy_num = 0, proxy_count = 0;
if (NULL == CONFIG_LOG_FILE || '\0' == *CONFIG_LOG_FILE)
zabbix_open_log(LOG_TYPE_SYSLOG, CONFIG_LOG_LEVEL, NULL);
@@ -564,14 +570,14 @@ int MAIN_ZABBIX_ENTRY()
DCsync_configuration();
DBclose();
- threads_num = 1 + CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS
- + CONFIG_HISTSYNCER_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_SELFMON_FORKS;
+ threads_num = CONFIG_CONFSYNCER_FORKS + CONFIG_HEARTBEAT_FORKS + CONFIG_DATASENDER_FORKS
+ + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
+ + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
+ + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS + CONFIG_IPMIPOLLER_FORKS
+ + CONFIG_JAVAPOLLER_FORKS + CONFIG_SELFMON_FORKS;
threads = calloc(threads_num, sizeof(pid_t));
- if (CONFIG_TRAPPER_FORKS > 0)
+ if (0 < CONFIG_TRAPPER_FORKS)
{
if (FAIL == zbx_tcp_listen(&listen_sock, CONFIG_LISTEN_IP, (unsigned short)CONFIG_LISTEN_PORT))
{
@@ -580,251 +586,123 @@ int MAIN_ZABBIX_ENTRY()
}
}
- for (i = 1; i <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS
- + CONFIG_HISTSYNCER_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_SELFMON_FORKS;
- i++)
+ for (i = 0; i < threads_num; i++)
{
- if (0 == (pid = zbx_fork()))
+ if (0 == (pid = zbx_child_fork()))
{
- server_num = i;
+ proxy_num = i + 1; /* child processes are numbered starting from 1 */
break;
}
else
threads[i] = pid;
}
- /* Main process */
- if (server_num == 0)
+ if (0 == proxy_num)
{
- set_parent_signal_handler();
-
- if (0 != CONFIG_HEARTBEAT_FORKS)
- {
- process_type = ZBX_PROCESS_TYPE_HEARTBEAT;
- process_num = 1;
+ zabbix_log(LOG_LEVEL_INFORMATION, "proxy #0 started [main process]");
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ wait(&i); /* wait for any child to exit */
- main_heart_loop();
- }
- else
- {
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started");
+ /* all exiting child processes should be caught by signal handlers */
+ THIS_SHOULD_NEVER_HAPPEN;
- for (;;)
- zbx_sleep(SEC_PER_HOUR);
- }
+ zbx_on_exit();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_CONFSYNCER_FORKS))
{
- /* the configuration syncer should be created first - variable threads[1] is used in daemon.c unit */
- process_type = ZBX_PROCESS_TYPE_CONFSYNCER;
- process_num = server_num;
+ /* !!! configuration syncer must be proxy #1 - child_signal_handler() uses threads[0] !!! */
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_CONFSYNCER, CONFIG_CONFSYNCER_FORKS);
- main_proxyconfig_loop(server_num);
+ main_proxyconfig_loop(proxy_num);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_HEARTBEAT_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_DATASENDER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS;
+ INIT_PROXY(ZBX_PROCESS_TYPE_HEARTBEAT, CONFIG_HEARTBEAT_FORKS);
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ main_heart_loop();
+ }
+ else if (proxy_num <= (proxy_count += CONFIG_DATASENDER_FORKS))
+ {
+ INIT_PROXY(ZBX_PROCESS_TYPE_DATASENDER, CONFIG_DATASENDER_FORKS);
main_datasender_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_POLLER_FORKS))
{
#ifdef HAVE_SNMP
- init_snmp("zabbix_server");
+ init_snmp("zabbix_proxy");
#endif
- process_type = ZBX_PROCESS_TYPE_POLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_POLLER, CONFIG_POLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_NORMAL);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_UNREACHABLE_POLLER_FORKS))
{
#ifdef HAVE_SNMP
- init_snmp("zabbix_server");
+ init_snmp("zabbix_proxy");
#endif
- process_type = ZBX_PROCESS_TYPE_UNREACHABLE;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_UNREACHABLE, CONFIG_UNREACHABLE_POLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_UNREACHABLE);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_TRAPPER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_TRAPPER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_TRAPPER, CONFIG_TRAPPER_FORKS);
main_trapper_loop(&listen_sock);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_PINGER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_PINGER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_PINGER, CONFIG_PINGER_FORKS);
main_pinger_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_HOUSEKEEPER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HOUSEKEEPER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_HOUSEKEEPER, CONFIG_HOUSEKEEPER_FORKS);
main_housekeeper_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_HTTPPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HTTPPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_HTTPPOLLER, CONFIG_HTTPPOLLER_FORKS);
main_httppoller_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_DISCOVERER_FORKS))
{
#ifdef HAVE_SNMP
- init_snmp("zabbix_server");
+ init_snmp("zabbix_proxy");
#endif
- process_type = ZBX_PROCESS_TYPE_DISCOVERER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_HTTPPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_DISCOVERER, CONFIG_DISCOVERER_FORKS);
main_discoverer_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_HISTSYNCER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HISTSYNCER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_HISTSYNCER, CONFIG_HISTSYNCER_FORKS);
main_dbsyncer_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_IPMIPOLLER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_IPMIPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_IPMIPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_IPMIPOLLER, CONFIG_IPMIPOLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_IPMI);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_JAVAPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_JAVAPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_IPMIPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_JAVAPOLLER, CONFIG_JAVAPOLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_JAVA);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_SELFMON_FORKS)
+ else if (proxy_num <= (proxy_count += CONFIG_SELFMON_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_SELFMON;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_DATASENDER_FORKS
- - CONFIG_POLLER_FORKS - CONFIG_UNREACHABLE_POLLER_FORKS
- - CONFIG_TRAPPER_FORKS - CONFIG_PINGER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_IPMIPOLLER_FORKS - CONFIG_JAVAPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_PROXY(ZBX_PROCESS_TYPE_SELFMON, CONFIG_SELFMON_FORKS);
main_selfmon_loop();
}
@@ -846,13 +724,7 @@ void zbx_on_exit()
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);
- for (i = 1; i <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS
- + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_SELFMON_FORKS; i++)
+ for (i = 0; i < threads_num; i++)
{
if (threads[i])
{
@@ -866,7 +738,7 @@ void zbx_on_exit()
free_metrics();
- zbx_sleep(2); /* wait for all threads closing */
+ zbx_sleep(2); /* wait for all child processes to exit */
DBconnect(ZBX_DB_CONNECT_EXIT);
free_database_cache();
diff --git a/src/zabbix_proxy/proxyconfig/proxyconfig.c b/src/zabbix_proxy/proxyconfig/proxyconfig.c
index 60c5040b7eb..de6d70b5ebc 100644
--- a/src/zabbix_proxy/proxyconfig/proxyconfig.c
+++ b/src/zabbix_proxy/proxyconfig/proxyconfig.c
@@ -98,8 +98,6 @@ void main_proxyconfig_loop()
{
zabbix_log(LOG_LEVEL_DEBUG, "In main_proxyconfig_loop()");
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/alerter/alerter.c b/src/zabbix_server/alerter/alerter.c
index 0e59e72c0b9..bb58c945432 100644
--- a/src/zabbix_server/alerter/alerter.c
+++ b/src/zabbix_server/alerter/alerter.c
@@ -142,8 +142,6 @@ void main_alerter_loop()
DB_ALERT alert;
DB_MEDIATYPE mediatype;
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/dbconfig/dbconfig.c b/src/zabbix_server/dbconfig/dbconfig.c
index bf2d5c40aab..b538eead5fb 100644
--- a/src/zabbix_server/dbconfig/dbconfig.c
+++ b/src/zabbix_server/dbconfig/dbconfig.c
@@ -51,8 +51,6 @@ void main_dbconfig_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_dbconfig_loop()");
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/dbsyncer/dbsyncer.c b/src/zabbix_server/dbsyncer/dbsyncer.c
index 4ff066a26d5..beab1833bf8 100644
--- a/src/zabbix_server/dbsyncer/dbsyncer.c
+++ b/src/zabbix_server/dbsyncer/dbsyncer.c
@@ -51,8 +51,6 @@ void main_dbsyncer_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_dbsyncer_loop() process_num:%d", process_num);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/discoverer/discoverer.c b/src/zabbix_server/discoverer/discoverer.c
index e79d88295a9..e620c3ca233 100644
--- a/src/zabbix_server/discoverer/discoverer.c
+++ b/src/zabbix_server/discoverer/discoverer.c
@@ -814,8 +814,6 @@ void main_discoverer_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_discoverer_loop() process_num:%d", process_num);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/escalator/escalator.c b/src/zabbix_server/escalator/escalator.c
index 29b139fbf0c..ef740559ec6 100644
--- a/src/zabbix_server/escalator/escalator.c
+++ b/src/zabbix_server/escalator/escalator.c
@@ -1242,8 +1242,6 @@ void main_escalator_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_escalator_loop()");
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/housekeeper/housekeeper.c b/src/zabbix_server/housekeeper/housekeeper.c
index 2181f196842..5a562c2f2b4 100644
--- a/src/zabbix_server/housekeeper/housekeeper.c
+++ b/src/zabbix_server/housekeeper/housekeeper.c
@@ -313,8 +313,6 @@ void main_housekeeper_loop()
{
int d, now;
- set_child_signal_handler();
-
for (;;)
{
zabbix_log(LOG_LEVEL_WARNING, "Executing housekeeper");
diff --git a/src/zabbix_server/httppoller/httppoller.c b/src/zabbix_server/httppoller/httppoller.c
index 30622432c7c..2ddd751dde8 100644
--- a/src/zabbix_server/httppoller/httppoller.c
+++ b/src/zabbix_server/httppoller/httppoller.c
@@ -102,8 +102,6 @@ void main_httppoller_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_httppoller_loop() process_num:%d", process_num);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/nodewatcher/nodewatcher.c b/src/zabbix_server/nodewatcher/nodewatcher.c
index 6dc6e0ed9a4..9588f6a5e5b 100644
--- a/src/zabbix_server/nodewatcher/nodewatcher.c
+++ b/src/zabbix_server/nodewatcher/nodewatcher.c
@@ -168,8 +168,6 @@ void main_nodewatcher_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_nodewatcher_loop()");
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/pinger/pinger.c b/src/zabbix_server/pinger/pinger.c
index 24defa5eebe..7f2a9861949 100644
--- a/src/zabbix_server/pinger/pinger.c
+++ b/src/zabbix_server/pinger/pinger.c
@@ -531,8 +531,6 @@ void main_pinger_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In main_pinger_loop() process_num:%d", process_num);
- set_child_signal_handler();
-
if (NULL == items)
items = zbx_malloc(items, sizeof(icmpitem_t) * items_alloc);
diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c
index dde5e532e72..6cfad5ba876 100644
--- a/src/zabbix_server/poller/poller.c
+++ b/src/zabbix_server/poller/poller.c
@@ -678,8 +678,6 @@ void main_poller_loop(unsigned char poller_type)
zabbix_log(LOG_LEVEL_DEBUG, "In main_poller_loop() process_type:'%s' process_num:%d",
get_process_type_string(process_type), process_num);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/proxypoller/proxypoller.c b/src/zabbix_server/proxypoller/proxypoller.c
index 03b6a802cd6..193868b55af 100644
--- a/src/zabbix_server/proxypoller/proxypoller.c
+++ b/src/zabbix_server/proxypoller/proxypoller.c
@@ -343,8 +343,6 @@ void main_proxypoller_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In %s() process_num:%d", __function_name, process_num);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/selfmon/selfmon.c b/src/zabbix_server/selfmon/selfmon.c
index b35089b49f5..2f043e7b71b 100644
--- a/src/zabbix_server/selfmon/selfmon.c
+++ b/src/zabbix_server/selfmon/selfmon.c
@@ -30,8 +30,6 @@ void main_selfmon_loop()
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
- set_child_signal_handler();
-
for (;;)
{
zbx_setproctitle("%s [processing data]", get_process_type_string(process_type));
diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c
index 346093f3210..bc42109087b 100644
--- a/src/zabbix_server/server.c
+++ b/src/zabbix_server/server.c
@@ -51,6 +51,12 @@
#include "proxypoller/proxypoller.h"
#include "selfmon/selfmon.h"
+#define INIT_SERVER(type, count) \
+ process_type = type; \
+ process_num = server_num - server_count + count; \
+ zabbix_log(LOG_LEVEL_INFORMATION, "server #%d started [%s #%d]", \
+ server_num, get_process_type_string(process_type), process_num)
+
const char *progname = NULL;
const char title_message[] = "Zabbix Server";
const char usage_message[] = "[-hV] [-c <file>] [-n <nodeid>] [-R <option>]";
@@ -465,7 +471,7 @@ int MAIN_ZABBIX_ENTRY()
DB_ROW row;
pid_t pid;
zbx_sock_t listen_sock;
- int i, server_num = 0;
+ int i, server_num = 0, server_count = 0;
if (NULL == CONFIG_LOG_FILE || '\0' == *CONFIG_LOG_FILE)
zabbix_open_log(LOG_TYPE_SYSLOG, CONFIG_LOG_LEVEL, NULL);
@@ -566,352 +572,164 @@ int MAIN_ZABBIX_ENTRY()
exit(FAIL);
}
- threads_num = 1 + CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS + CONFIG_NODEWATCHER_FORKS
- + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS;
+ threads_num = CONFIG_CONFSYNCER_FORKS + CONFIG_WATCHDOG_FORKS + CONFIG_POLLER_FORKS
+ + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
+ + CONFIG_ALERTER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
+ + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS
+ + CONFIG_HISTSYNCER_FORKS + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS
+ + CONFIG_JAVAPOLLER_FORKS + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS;
threads = calloc(threads_num, sizeof(pid_t));
- if (CONFIG_TRAPPER_FORKS > 0)
+ if (0 < CONFIG_TRAPPER_FORKS)
{
if (FAIL == zbx_tcp_listen(&listen_sock, CONFIG_LISTEN_IP, (unsigned short)CONFIG_LISTEN_PORT))
{
- zabbix_log(LOG_LEVEL_CRIT, "Listener failed with error: %s.", zbx_tcp_strerror());
+ zabbix_log(LOG_LEVEL_CRIT, "listener failed: %s", zbx_tcp_strerror());
exit(1);
}
}
- for (i = 1; i <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS
- + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS + CONFIG_NODEWATCHER_FORKS
- + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
- + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS; i++)
+ for (i = 0; i < threads_num; i++)
{
- if (0 == (pid = zbx_fork()))
+ if (0 == (pid = zbx_child_fork()))
{
- server_num = i;
+ server_num = i + 1; /* child processes are numbered starting from 1 */
break;
}
else
threads[i] = pid;
}
- /* main process */
- if (server_num == 0)
+ if (0 == server_num)
{
- set_parent_signal_handler();
+ zabbix_log(LOG_LEVEL_INFORMATION, "server #0 started [main process]");
- process_type = ZBX_PROCESS_TYPE_WATCHDOG;
- process_num = 1;
+ wait(&i); /* wait for any child to exit */
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ /* all exiting child processes should be caught by signal handlers */
+ THIS_SHOULD_NEVER_HAPPEN;
- main_watchdog_loop();
+ zbx_on_exit();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS)
+ else if (server_num <= (server_count += CONFIG_CONFSYNCER_FORKS))
{
- /* the configuration syncer should be created first - variable threads[1] is used in daemon.c unit */
- process_type = ZBX_PROCESS_TYPE_CONFSYNCER;
- process_num = server_num;
+ /* !!! configuration syncer must be server #1 - child_signal_handler() uses threads[0] !!! */
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_CONFSYNCER, CONFIG_CONFSYNCER_FORKS);
main_dbconfig_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_WATCHDOG_FORKS))
+ {
+ INIT_SERVER(ZBX_PROCESS_TYPE_WATCHDOG, CONFIG_WATCHDOG_FORKS);
+
+ main_watchdog_loop();
+ }
+ else if (server_num <= (server_count += CONFIG_POLLER_FORKS))
{
#ifdef HAVE_SNMP
init_snmp("zabbix_server");
#endif
- process_type = ZBX_PROCESS_TYPE_POLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_POLLER, CONFIG_POLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_NORMAL);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_UNREACHABLE_POLLER_FORKS))
{
#ifdef HAVE_SNMP
init_snmp("zabbix_server");
#endif
- process_type = ZBX_PROCESS_TYPE_UNREACHABLE;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_UNREACHABLE, CONFIG_UNREACHABLE_POLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_UNREACHABLE);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS)
+ else if (server_num <= (server_count += CONFIG_TRAPPER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_TRAPPER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_TRAPPER, CONFIG_TRAPPER_FORKS);
main_trapper_loop(&listen_sock);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS)
+ else if (server_num <= (server_count += CONFIG_PINGER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_PINGER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_PINGER, CONFIG_PINGER_FORKS);
main_pinger_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS)
+ else if (server_num <= (server_count += CONFIG_ALERTER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_ALERTER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_ALERTER, CONFIG_ALERTER_FORKS);
main_alerter_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS)
+ else if (server_num <= (server_count += CONFIG_HOUSEKEEPER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HOUSEKEEPER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_HOUSEKEEPER, CONFIG_HOUSEKEEPER_FORKS);
main_housekeeper_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS)
+ else if (server_num <= (server_count += CONFIG_TIMER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_TIMER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_TIMER, CONFIG_TIMER_FORKS);
main_timer_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS)
+ else if (server_num <= (server_count += CONFIG_NODEWATCHER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_NODEWATCHER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_NODEWATCHER, CONFIG_NODEWATCHER_FORKS);
main_nodewatcher_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_HTTPPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HTTPPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_HTTPPOLLER, CONFIG_HTTPPOLLER_FORKS);
main_httppoller_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS)
+ else if (server_num <= (server_count += CONFIG_DISCOVERER_FORKS))
{
#ifdef HAVE_SNMP
init_snmp("zabbix_server");
#endif
- process_type = ZBX_PROCESS_TYPE_DISCOVERER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_DISCOVERER, CONFIG_DISCOVERER_FORKS);
main_discoverer_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS)
+ else if (server_num <= (server_count += CONFIG_HISTSYNCER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_HISTSYNCER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_HISTSYNCER, CONFIG_HISTSYNCER_FORKS);
main_dbsyncer_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS)
+ else if (server_num <= (server_count += CONFIG_ESCALATOR_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_ESCALATOR;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_ESCALATOR, CONFIG_ESCALATOR_FORKS);
main_escalator_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_IPMIPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_IPMIPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_ESCALATOR_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_IPMIPOLLER, CONFIG_IPMIPOLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_IPMI);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS
- + CONFIG_JAVAPOLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_JAVAPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_JAVAPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_ESCALATOR_FORKS - CONFIG_IPMIPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_JAVAPOLLER, CONFIG_JAVAPOLLER_FORKS);
main_poller_loop(ZBX_POLLER_TYPE_JAVA);
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS
- + CONFIG_JAVAPOLLER_FORKS + CONFIG_PROXYPOLLER_FORKS)
+ else if (server_num <= (server_count += CONFIG_PROXYPOLLER_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_PROXYPOLLER;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_ESCALATOR_FORKS - CONFIG_IPMIPOLLER_FORKS
- - CONFIG_JAVAPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_PROXYPOLLER, CONFIG_PROXYPOLLER_FORKS);
main_proxypoller_loop();
}
- else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS
- + CONFIG_JAVAPOLLER_FORKS + CONFIG_PROXYPOLLER_FORKS
- + CONFIG_SELFMON_FORKS)
+ else if (server_num <= (server_count += CONFIG_SELFMON_FORKS))
{
- process_type = ZBX_PROCESS_TYPE_SELFMON;
- process_num = server_num - CONFIG_CONFSYNCER_FORKS - CONFIG_POLLER_FORKS
- - CONFIG_UNREACHABLE_POLLER_FORKS - CONFIG_TRAPPER_FORKS
- - CONFIG_PINGER_FORKS - CONFIG_ALERTER_FORKS
- - CONFIG_HOUSEKEEPER_FORKS - CONFIG_TIMER_FORKS
- - CONFIG_NODEWATCHER_FORKS - CONFIG_HTTPPOLLER_FORKS
- - CONFIG_DISCOVERER_FORKS - CONFIG_HISTSYNCER_FORKS
- - CONFIG_ESCALATOR_FORKS - CONFIG_IPMIPOLLER_FORKS
- - CONFIG_JAVAPOLLER_FORKS - CONFIG_PROXYPOLLER_FORKS;
-
- zabbix_log(LOG_LEVEL_WARNING, "server #%d started [%s]",
- server_num, get_process_type_string(process_type));
+ INIT_SERVER(ZBX_PROCESS_TYPE_SELFMON, CONFIG_SELFMON_FORKS);
main_selfmon_loop();
}
@@ -928,20 +746,12 @@ void zbx_on_exit()
int i;
sigset_t set;
- /* ignore SIGCHLD signals in order for zbx_sleep() to work */
+ /* ignore SIGCHLD signals in order for zbx_sleep() to work */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);
- for (i = 1; i <= CONFIG_CONFSYNCER_FORKS + CONFIG_POLLER_FORKS
- + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS
- + CONFIG_PINGER_FORKS + CONFIG_ALERTER_FORKS
- + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
- + CONFIG_NODEWATCHER_FORKS + CONFIG_HTTPPOLLER_FORKS
- + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
- + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS
- + CONFIG_JAVAPOLLER_FORKS + CONFIG_PROXYPOLLER_FORKS
- + CONFIG_SELFMON_FORKS; i++)
+ for (i = 0; i < threads_num; i++)
{
if (threads[i])
{
@@ -955,7 +765,7 @@ void zbx_on_exit()
free_metrics();
- zbx_sleep(2); /* wait for all threads closing */
+ zbx_sleep(2); /* wait for all child processes to exit */
DBconnect(ZBX_DB_CONNECT_EXIT);
free_database_cache();
diff --git a/src/zabbix_server/timer/timer.c b/src/zabbix_server/timer/timer.c
index 4a9d0141ebf..9e345941321 100644
--- a/src/zabbix_server/timer/timer.c
+++ b/src/zabbix_server/timer/timer.c
@@ -759,8 +759,6 @@ void main_timer_loop()
{
int now, nextcheck, sleeptime, maintenance = 1;
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/trapper/trapper.c b/src/zabbix_server/trapper/trapper.c
index 02fbffc2cf9..f42f2088b02 100644
--- a/src/zabbix_server/trapper/trapper.c
+++ b/src/zabbix_server/trapper/trapper.c
@@ -424,8 +424,6 @@ void main_trapper_loop(zbx_sock_t *s)
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
- set_child_signal_handler();
-
zbx_setproctitle("%s [connecting to the database]", get_process_type_string(process_type));
DBconnect(ZBX_DB_CONNECT_NORMAL);
diff --git a/src/zabbix_server/watchdog/watchdog.c b/src/zabbix_server/watchdog/watchdog.c
index 21c8541954b..8e9a99c55ed 100644
--- a/src/zabbix_server/watchdog/watchdog.c
+++ b/src/zabbix_server/watchdog/watchdog.c
@@ -52,14 +52,8 @@ extern unsigned char process_type;
* *
* Purpose: send warning message to all interested *
* *
- * Parameters: *
- * *
- * Return value: *
- * *
* Author: Alexei Vladishev *
* *
- * Comments: *
- * *
******************************************************************************/
static void send_alerts()
{
@@ -85,14 +79,8 @@ static void send_alerts()
* *
* Purpose: init list of medias to send notifications in case if DB is down *
* *
- * Parameters: *
- * *
- * Return value: *
- * *
* Author: Alexei Vladishev *
* *
- * Comments: *
- * *
******************************************************************************/
static void init_config()
{
@@ -151,14 +139,8 @@ static void init_config()
* *
* Purpose: check availability of database *
* *
- * Parameters: *
- * *
- * Return value: *
- * *
* Author: Alexei Vladishev *
* *
- * Comments: *
- * *
******************************************************************************/
static void ping_database()
{
@@ -166,7 +148,7 @@ static void ping_database()
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
- if (FAIL == DBping()) /* check whether a connection to the database can be made */
+ if (FAIL == DBping()) /* check whether a connection to the database can be made */
{
zabbix_log(LOG_LEVEL_WARNING, "Watchdog: Database is down");
send_alerts();
@@ -184,10 +166,6 @@ static void ping_database()
* Purpose: periodically checks availability of database and alerts admins if *
* down *
* *
- * Parameters: *
- * *
- * Return value: *
- * *
* Author: Alexei Vladishev *
* *
* Comments: check database availability every 60 seconds (hardcoded) *
@@ -197,8 +175,6 @@ void main_watchdog_loop()
{
zabbix_log(LOG_LEVEL_DEBUG, "In main_watchdog_loop()");
- set_child_signal_handler();
-
/* disable writing to database in zabbix_syslog() */
CONFIG_ENABLE_LOG = 0;