Linux 查找某一线程是否已运行,并启动的方法
参考资料:(3条消息) 【Linux】守护线程自动重启某个程序的3种常用办法_L7256的博客-CSDN博客_守护进程 自动重启
方法一:使用编写一个监控APP的脚本
start.sh脚本如下:export LD_LIBRARY_PATH=./
while true;do server=`ps aux | grep a.out |grep -v grep` /*grep -v grep 排查掉带grep的行*/ if [! "$server" ]; then ./a.out sleep 1 echo "reboot" fi sleep 2 echo "this is sleep 5" done
LD_LIBRARY_PATH=./ 添加当前路径为搜索路径
test.c 测试程序
#include <stdio.h> int main(int argc, char *argv[]) { for(;;) { printf("This is me\n"); sleep(1); } return 0; }
1、运行脚本-》a.out 自动运行-》kill -9 pid 杀掉程序-》a.out再次自动运行。
二 C 语言方法执行终端命令查找a.out 是否已经在运行。
#include <stdio.h> #include <stdlib.h> #include <string.h> /*awk '{print $2} print second column'*/ #define EXEC_FIND_A "ps aux | grep a.out | grep -v grep | awk '{print $2}'" #define MAX_SIZE 1024 int executeCMD(const char * cmd, char *result) { char buf_ps[MAX_SIZE]; char ps[MAX_SIZE]={0}; FILE *ptr; strcpy(ps,cmd); if((ptr = popen(ps,"r")) != NULL) { while(fgets(buf_ps,MAX_SIZE,ptr) != NULL) { strcat(result,buf_ps); if(strlen(result)> 1024) break; } pclose(ptr); ptr = NULL; } else { printf("popen %s error\n",ps); return -1; } return 0; } int main(char argc,char *argv[]) { char result[1024] ={0}; executeCMD(EXEC_FIND_A,result); printf("%s",result); return 0; }
三、查看/proc目录下是否有这个线程
首先要有一个概念,每一个被创建的线程都会放在proc文件夹下,而在proc文件夹的以线程ID命名的文件夹里面都包含有一堆关于这个线程ID的相关信息。而正在执行的程序名字就在/proc/[PID]/status文件夹内。
所以思路就是:
1.遍历/proc文件夹下所有的进程ID,然后用fopen去读/proc/[进程ID]/status的文件内容。如果有这个ID,并且读出文件的Name和预期的一样,就证明这个程序存在。
2.当遍历了所有的/proc/[进程ID]/status也没有找到我们想要的这个线程名字(a.out),就用execl("./a.out")重启这个程序。。
参考代码:仅有找到/proc/[PID]/status文件的Name是否与预期结果相同的代码。。。具体操作见代码前面的注释。。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <dirent.h> #include <sys/types.h> using namespace std /*using namespace std,就是说用C++的标准名字空间*/ int main(int argc ,char * argv[]) { DIR *pdir = NULL; struct dirent *pde = NULL; FILE *pf = NULL; char buff[128]; char buff2[128]; char *pstr = NULL; int n; int i; pdir = opendir("/proc"); if(!pdir) { perror("open /proc fail.\n"); return -1; } while((pde = readdir(pdir))) { if((pde->d_name[0] < '0') || (pde->d_name[0] > '9')) { continue; } sprintf(buff,"/proc/%s/status",pde->d_name); printf("path = %s\n",buff); pf = fopen(buff,"r"); if(pf) { n =fread(buff,1,127,pf); printf("buff = %s\n",buff); fclose(pf); buff[n] =0; for(i = 0;i < n;i++) { if('\n' == buff[i]) { buff[i] = 0; break; } } printf("== %s ==\n",buff); n = i; for(i =0;i < n;i++) { if((' ' ==buff[i]) || ('\t' == buff[i])) { break; } } for(;i < n;i++) { if((' ' != buff[i]) && ('\t' != buff[i])) { break; } } printf("NAME:%s\n",buff +i); if(0 == strcmp(buff +i, argv[1])) { printf("found %s, pid = %d\n",buff +i,atoi(pde->d_name)); break; } } } closedir(pdir); return 0; }
topeet@ubuntu:~/usb_test$ ./proc_find_pro a.out