blob: a814bd65e01d01dee449481e4ffc9c74695c30da [file] [log] [blame]
/*
* instance_monitor_service.c
*
* $file_describe$
*
*/
/******************************************************************************
EDIT HISTORY FOR FILE
WHEN WHO WHAT,WHERE,WHY
-------- -------- -------------------------------------------------------
2024/6/12 LiuBin Initial version
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include "instance_info.h"
#include "mbtk_log.h"
#include "mbtk_utils.h"
#define INS_MONITOR_INTERVAL 3 // s
int instance_info_size = 0;
instance_info_t instance_infos[INSTANCE_NUM_MAX] = {0};
static void program_start(instance_info_t *info)
{
LOGD("Will start program : %s", info->ins_name);
mbtk_system(info->ins_cmd);
}
static int pidof(const char *program)
{
char buff[128] = {0};
char cmd[128] = {0};
snprintf(cmd, sizeof(cmd), "pidof %s", program);
if(mbtk_cmd_line(cmd, buff, sizeof(buff)) && strlen(buff)) {
int pid = atoi(buff);
if(pid > 0) {
return pid;
} else {
return -1;
}
}
return -1;
}
static void* ins_monitor_service_run(void *arg)
{
int i = 0;
LOGD("Will monitor program:");
while(i < instance_info_size) {
LOGD("%s:%s", instance_infos[i].ins_name, instance_infos[i].ins_cmd);
if(instance_infos[i].ins_pid < 0) {
instance_infos[i].ins_pid = pidof(instance_infos[i].ins_name);
}
if(instance_infos[i].ins_pid < 0) {
LOGE("%s has not running,will not monitor...", instance_infos[i].ins_name);
}
i++;
}
while(1) {
sleep(INS_MONITOR_INTERVAL);
i = 0;
while(i < instance_info_size) {
if(instance_infos[i].ins_pid > 0) {
int pid = pidof(instance_infos[i].ins_name);
if(pid > 0) {
// Programe is running, do nothing.
} else {
program_start(instance_infos + i);
}
}
i++;
}
}
return NULL;
}
int ins_monitor_service_start()
{
pthread_t pid;
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
{
LOGE("pthread_attr_setdetachstate() fail.");
return -1;
}
if(pthread_create(&pid, &thread_attr, ins_monitor_service_run, NULL))
{
LOGE("pthread_create() fail.");
return -1;
}
return 0;
}