main函數
與zabbix_server中main函數的流程類似。
daemon_start函數
與zabbix_server中main函數的流程一致。只不過在agent中,daemon_start函數被START_MAIN_ZABBIX_ENTRY宏封裝了一下。
MAIN_ZABBIX_ENTRY函數
與zabbix_server中MAIN_ZABBIX_ENTRY函數的流程類似,只是其中有些步驟採取的操作不同。操作序列如下圖所示:
創建子進程
int MAIN_ZABBIX_ENTRY(int flags)
{
...
// 總進程數。
/* allocate memory for a collector, all listeners and active checks */
threads_num = CONFIG_COLLECTOR_FORKS + CONFIG_PASSIVE_FORKS + CONFIG_ACTIVE_FORKS;
// 分配內存
threads = (ZBX_THREAD_HANDLE *)zbx_calloc(threads, threads_num, sizeof(ZBX_THREAD_HANDLE));
// 啓動每一個子進程
for (i = 0; i < threads_num; i++)
{
zbx_thread_args_t *thread_args;
// 根據threads_num來循環,獲取本次循環中進程的類型和進程編號
thread_args = (zbx_thread_args_t *)zbx_malloc(NULL, sizeof(zbx_thread_args_t));
if (FAIL == get_process_info_by_thread(i + 1, &thread_args->process_type, &thread_args->process_num))
{
THIS_SHOULD_NEVER_HAPPEN;
exit(EXIT_FAILURE);
}
thread_args->server_num = i + 1;
thread_args->args = NULL;
switch (thread_args->process_type)
{
case ZBX_PROCESS_TYPE_COLLECTOR:
zbx_thread_start(collector_thread, thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_LISTENER:
thread_args->args = &listen_sock;
zbx_thread_start(listener_thread, thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_ACTIVE_CHECKS:
thread_args->args = &CONFIG_ACTIVE_ARGS[j++];
zbx_thread_start(active_checks_thread, thread_args, &threads[i]);
break;
}
zbx_free(thread_args);
}
while (-1 == wait(&i)) /* wait for any child to exit */
{
if (EINTR != errno)
{
zabbix_log(LOG_LEVEL_ERR, "failed to wait on child processes: %s", zbx_strerror(errno));
break;
}
}
/* all exiting child processes should be caught by signal handlers */
THIS_SHOULD_NEVER_HAPPEN;
// 進程退出時的操作
zbx_on_exit();
return SUCCEED;
}
zabbix agent啓動的時候,默認會啓動三個進程。
-
collector_thread
: 用來收集本機的基本監控信息(收集cpu狀態存入結構體ZBX_CPUS_STAT_DATA
中,收集磁盤的狀態存入結構體ZBX_DISKDEVICES_DATA
中)。 -
listener_thread
: 用來實現zabbix server連接過來的被動監控,它負責監聽10050端口,然後等待server端的請求並進行響應。 -
active_checks_thread
: 負責主動發送收集到的信息給zabbix_server。
listener_thread
和active_checks_thread
分別對應agent的被動和主動工作模式,在《Zabbix Agent主動和被動工作模式源碼解析》詳細分析。