修复:防止 ATSC 应用重复启动

This commit is contained in:
2026-08-28 13:23:53 +08:00
parent 92b155499d
commit f939716614
+78 -40
View File
@@ -5,68 +5,107 @@
***************************************/ ***************************************/
#include "common.h" #include "common.h"
#include <dirent.h>
#include <limits.h>
//程序名字
#define PROGRAM_NAME "imx_atsc_app"
#define NODE_NAME "http" #define NODE_NAME "http"
//查找进程中程序名字
#define PROGRAM_NAME_FIND "imx_atsc_app"
#define PROGRAM_NODE_NAME_FIND "http" #define PROGRAM_NODE_NAME_FIND "http"
//输出目录 //输出目录
#define PROGRAM_DIR_OUT_FILE "/tmp/atsc_app_status"
#define NODE_PROGRAM_DIR_OUT_FILE "/tmp/web_p_status" #define NODE_PROGRAM_DIR_OUT_FILE "/tmp/web_p_status"
//要运行的程序 //要运行的程序
//#define RUN_NAME_PROGRAM "/aw/anywave/app/imx_atsc_app 1 &" #define PROGRAM_EXE_PATH "/aw/anywave/app/imx_atsc_app"
#define RUN_NAME_PROGRAM "/aw/anywave/app/imx_atsc_app 1 2>&1 | loglog /var/module_log/ imx_atsc_app.log 1 &" #define RUN_NAME_PROGRAM PROGRAM_EXE_PATH " 2>&1 | /usr/sbin/loglog /var/module_log/ imx_atsc_app.log 1 &"
#define RUN_NODE_NAME_PROGRAM "cd /aw/anywave/web/sh && ./start_web.sh &" #define RUN_NODE_NAME_PROGRAM "cd /aw/anywave/web/sh && ./start_web.sh &"
/* The application renames its main task with pthread_setname_np(), therefore
* BusyBox `ps | grep imx_atsc_app` can report it as missing and the daemon may
* start a second instance. /proc/<pid>/exe remains stable across task renames
* and also lets us match the exact executable instead of a substring. */
static int is_app_running(void)
{
DIR *proc_dir;
struct dirent *entry;
char exe_link[64];
char exe_path[PATH_MAX];
ssize_t exe_len;
size_t expected_len = strlen(PROGRAM_EXE_PATH);
int main(int argc,char *argv[]) proc_dir = opendir("/proc");
if(proc_dir == NULL)
{
/* Fail safe: an unreadable /proc must not cause duplicate app starts. */
return -1;
}
while((entry = readdir(proc_dir)) != NULL)
{
const char *p = entry->d_name;
if(*p == '\0')
{
continue;
}
while(*p >= '0' && *p <= '9')
{
p++;
}
if(*p != '\0')
{
continue;
}
snprintf(exe_link, sizeof(exe_link), "/proc/%s/exe", entry->d_name);
exe_len = readlink(exe_link, exe_path, sizeof(exe_path) - 1);
if(exe_len < 0)
{
continue;
}
exe_path[exe_len] = '\0';
if(strcmp(exe_path, PROGRAM_EXE_PATH) == 0 ||
(strncmp(exe_path, PROGRAM_EXE_PATH, expected_len) == 0 &&
strcmp(exe_path + expected_len, " (deleted)") == 0))
{
closedir(proc_dir);
return 1;
}
}
closedir(proc_dir);
return 0;
}
int main(void)
{ {
int fd = 0; int fd = 0;
int ret = 0;
int remux_ok = 0; int remux_ok = 0;
int node_ok = 0; int node_ok = 0;
char buf[100]; char buf[100];
char cmd[100] = {0}; char cmd[256] = {0};
//开启守护进程 //开启守护进程
daemon(0,0); daemon(0,0);
while (1) while (1)
{ {
//新建输出文件 remux_ok = is_app_running();
memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "echo 0 > %s", PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd);
//获得程序ID
memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "ps | grep %s | grep -v grep >> %s", PROGRAM_NAME_FIND, PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd);
//打开输出文件
fd = open(PROGRAM_DIR_OUT_FILE, O_CREAT|O_RDONLY, 0777);
memset(buf, 0, 100);
read(fd, buf, 100);
close(fd);
remux_ok = match(buf, PROGRAM_NAME, 90);
// web // web
memset(cmd, 0 ,sizeof(cmd)); memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "echo 0 > %s", NODE_PROGRAM_DIR_OUT_FILE); sprintf(cmd, "echo 0 > %s", NODE_PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd); (void)os_system(cmd);
//获得程序ID //获得程序ID
memset(cmd, 0 ,sizeof(cmd)); memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "ps | grep %s | grep -v grep >> %s", PROGRAM_NODE_NAME_FIND, NODE_PROGRAM_DIR_OUT_FILE); sprintf(cmd, "ps | grep %s | grep -v grep >> %s", PROGRAM_NODE_NAME_FIND, NODE_PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd); (void)os_system(cmd);
//打开输出文件 //打开输出文件
fd = open(NODE_PROGRAM_DIR_OUT_FILE, O_CREAT|O_RDONLY, 0777); fd = open(NODE_PROGRAM_DIR_OUT_FILE, O_CREAT|O_RDONLY, 0777);
@@ -80,14 +119,17 @@ int main(int argc,char *argv[])
//判断是否有程序文件运行 //判断是否有程序文件运行
if(1 != remux_ok) if(1 != remux_ok)
{ {
//运行程序 /* Debounce once before starting. This prevents a duplicate launch
* when the app is between exec/startup states during an upgrade. */
usleep(1000000); usleep(1000000);
if(!is_app_running())
memset(cmd, 0 ,sizeof(cmd)); {
sprintf(cmd, "%s", RUN_NAME_PROGRAM); memset(cmd, 0 ,sizeof(cmd));
printf("imx_atsc_app stop , daemon work.\n%s\n\n", cmd); snprintf(cmd, sizeof(cmd), "%s", RUN_NAME_PROGRAM);
system(cmd); printf("imx_atsc_app stop, daemon restart without legacy argument.\n%s\n\n", cmd);
usleep(100000); system(cmd);
usleep(100000);
}
} }
if(1 != node_ok) if(1 != node_ok)
{ {
@@ -102,13 +144,9 @@ int main(int argc,char *argv[])
//删除输出文件 //删除输出文件
memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "rm %s", PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd);
memset(cmd, 0 ,sizeof(cmd)); memset(cmd, 0 ,sizeof(cmd));
sprintf(cmd, "rm %s", NODE_PROGRAM_DIR_OUT_FILE); sprintf(cmd, "rm %s", NODE_PROGRAM_DIR_OUT_FILE);
ret = os_system(cmd); (void)os_system(cmd);
} }