Zabbix源碼解析之Zabbix Agent啓動流程

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_threadactive_checks_thread分別對應agent的被動和主動工作模式,在《Zabbix Agent主動和被動工作模式源碼解析》詳細分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章