参考资料:(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. Redis 01: 非关系型数据库 + 配置Redis

    数据库应用的发展历程 单机数据库时代:一个应用,一个数据库实例 缓存时代:对某些表中的数据访问频繁,则对这些数据设置缓存(此时数据库中总的数据量不是很大) 水平切分时代:将数据库中的表存放到不同数据库 ...

  2. python关于Django搭建简单博客项目(教程)

    由于csdn各种django blog博文都有或多或少的bug,所以我决定自己写一篇,先附上教程,详解在另一篇博文里,为了便于大家复制粘贴,本文代码尽量不使用图片. 源代码及解析文章请在我的githu ...

  3. Spring源码知识

    bean的生命周期: 实例化:在堆空间中申请内存,使用反射来实现:(createBeanInstance) 自定义属性赋值(setter).容器对象属性赋值(invokeAwareMethods) 前 ...

  4. 关于Object.keys()和Object.values()的使用

    关于Object.keys()和Object.values()的使用 1. 关于Object.keys() 1) 处理对象,返回可枚举的所有可枚举属性的字符串数组 let person ={ name ...

  5. Rock18框架之整体框架介绍

    1. 总体框架图 2.框架能解决哪些问题? 问题1: 自动化设备包含龙门架.机械手.伺服.步进等电机.IO控制.定位及纠偏.界面展示等部分.其中硬件(伺服.IO等)是需要更换的,硬件的更换不影响整套系 ...

  6. JS逆向实战7-- 某省在线审批网站params 随机生成

    参数分析 我们首先通过抓包 发现这个就是我们所需要的数据 然后我们通过fidder 发起请求 结果: 通过我们反复测试 发现这个params的参数是每次请求中都会变化的 断点查找 我们通过 这个t参数 ...

  7. 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++85——完美数

    本题是浙江理工大学ACM入队200题第八套中的L题 我们先来看一下这题的题面. 题面 题目描述 任何一个自然数的约数中都有1和它本身,我们把小于它本身的因数叫做这个自然数的真约数. 如6的所有真约数是 ...

  8. SpringBoot 08: SpringBoot综合使用 MyBatis, Dubbo, Redis

    业务背景 Student表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COL ...

  9. Linux Polkit本地权限提升漏洞(CVE-2021-4034)

    Linux Polkit本地权限提升漏洞(CVE-2021-4034) 免责声明: 漏洞描述 影响范围 漏洞检测 漏洞复现 修复建议 免责声明: 发现这个漏洞被各大预警平台刷屏了,目前主流Linux系 ...

  10. EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频

    一.序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO.BO.VO.DTO等数据模型转换经常发生.今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct Bea ...