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 


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 
#include 
#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 
#include 
#include 
#include <string.h>
#include 
#include 
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