参考资料:(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

  

Linux 查找某一线程是否已运行,并启动的方法的更多相关文章

  1. Linux 下让进程在后台可靠运行的几种方法

    想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一 ...

  2. Linux下让进程在后台可靠运行的几种方法

    想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一 ...

  3. linux 下线程错误查找,与线程分析命令

    一. 使用top和jstack查找线程错误 我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu ...

  4. linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np

    =============================================================== linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主 ...

  5. linux查找进程id端口占用和杀死进程

    linux 查找进程id端口占用和杀死进程 ps 命令用于查看当前正在运行的进程 辅助上grep 用于搜索匹配ps -ef | grep java ps ax : 显示当前系统进程的列表 ps aux ...

  6. Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理

    摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 记录一下Linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理.当用 ...

  7. 搭建Linux(Ubuntu)系统下的Differential Datalog运行环境

    DDlog is a bottom-up, incremental, in-memory, typed Datalog engine. It is well suited for writing pr ...

  8. 以 DEBUG 方式深入理解线程的底层运行原理

    说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到 JVM 了.其实大家明白了 Java 的运行时数据区域,也就明白了线程的底层原理,不过把这些东西明明白白写在纸面上的,网络上的文章并 ...

  9. [转载]了解Linux的进程与线程

    本文转自Tim Yang的博客http://timyang.net/linux/linux-process/ .对于理解Linux的进程与线程非常有帮助.支持原创.尊重原创,分享知识! 上周碰到部署在 ...

随机推荐

  1. windows下 安装docker

    一.Docker 1.什么是docker 对比 特性 容器 虚拟机 启动 秒级 分钟级 磁盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2. 使用d ...

  2. 使用canvas 根据角度画圆弧

    最近收到一个需求,根据角度在平面上画出对应的区域,实际就是 以固定的原点,根据起始角度和结束角度和半径,画出他的区域. 写了一小段,试试 export class Draw {   construct ...

  3. Java多线程的几种创建方式

    方法一:继承Thread类,重写run方法,直接调用start方法开启线程. /** * 继承Thread类,直接调用start方法开启线程. * @author LuRenJia */ public ...

  4. YC-Framework版本更新:V1.0.10

    分布式微服务框架:YC-Framework版本更新V1.0.10!!! 本文主要内容: 1.V1.0.10版本更新主要内容2.YC-Framework相关系列文章分享 一.V1.0.10版本更新主要内 ...

  5. 【笔记】CF1607F Robot on the Board 2 及相关

    题目传送门 记忆化搜索 首先,这题 \(10000\) 组 \(2000\times 2000\) 的数据直接爆搜肯定会超时.想到,如果一个点的答案已经被更新过,之后走到这个点能再多走的点也就确定了, ...

  6. perl中 use strict会出现“requires explicit package name”错误

    转载 perl中use strict的用法 如果你使用 use strict 的话,它会强迫你用 my 声明变量,否则将会报上述错误.

  7. Optional对象

    Optional对象 Optional 类是一个可以为null的容器对象,用于简化Java中对空值的判断处理,以防止出现各种空指针异常. 静态方法-of 必须确定对象不为null 在使用of封装成op ...

  8. SolidEdge ST8安装教程

    SolidEdge ST8安装教程: 1.使用百度云客户端下载Solidedge ST8软件安装包,打开软件安装文件夹: 2.选择.ISO安装文件,打开.ISO安装文件,可以解压或使用虚拟光驱加载: ...

  9. Go语言核心36讲52

    你好,我是郝林. 专栏到这里,就要结束了. 差不多在半年以前(2018年的第二个季度),极客时间的总编辑郭蕾找到我,说想让我写一个关于Go语言的技术专栏. 我那时候还在轻松筹担任大数据负责人,管理着四 ...

  10. Go语言核心36讲35

    到目前为止,我们已经一起学习了Go语言标准库中最重要的那几个同步工具,这包括非常经典的互斥锁.读写锁.条件变量和原子操作,以及Go语言特有的几个同步工具: sync/atomic.Value: syn ...