参考资料:(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. 齐博x1内容页中下一页上一页的标签

    在模板中分别插入如下代码即可 前一页 {:fun('content@prev',$info,20)} 后一页 {:fun('content@next',$info,20)} 复制 其中20代表取标题多 ...

  2. 基于YOLO和PSPNet的目标检测与语义分割系统(python)

    基于YOLO和PSPNet的目标检测与语义分割系统 源代码地址 概述 这是我的本科毕业设计 它的主要功能是通过YOLOv5进行目标检测,并使用PSPNet进行语义分割. 本项目YOLOv5部分代码基于 ...

  3. 软件架构(六)MVC架构历史

    一.引子 一个系统可能由很多子系统组成.各子系统内部高度内聚,子系统之间低耦合.子系统关注自己的职责.实现:   职责分离,关注点分离.----MVC架构早期就是为了分离视图.模型而诞生的. 注:很多 ...

  4. Unity——滚动的小球

    Unity--滚动的小球 工程理解 本游戏为通过键盘上的W.A.S.D键控制小球的运动轨迹来对固定位置上的小方块进行碰撞,以此来进行加分计数的. 其中主要对象为小球和自转的小方块:在小球上,我们添加刚 ...

  5. SpringBoot3.x原生镜像-Native Image尝鲜

    前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了.在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framewor ...

  6. 畅联新增物联网设备接入协议:精华隆的NB一键报警

    这个是有点时间了,这里记录一下! ----------------------------------------------------------------------------------- ...

  7. Vue3实现动态导入Excel表格数据

    1.  前言 在开发工作过程中,我们会遇到各种各样的表格数据导入,大部分我们的解决方案:提供一个模板前端进行下载,然后按照这个模板要求进行数据填充,最后上传导入,这是其中一种解决方案.个人认为还有另外 ...

  8. 阿里云 ACK 接入观测云

    简介 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理.2021 年成为国内唯一连续三年入选 Gartner 公共云容器报告的 ...

  9. tekla软件安装教程

    Tekla2020 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载Tekla2020_x64软件安装包到电脑磁盘,并鼠标右击进行解压缩,安装前先断开电脑网络,然后找 ...

  10. ssh明文密码小工具:sshpass

    Xshell 远程时可以用如下方式进行明文密码免交互登陆: ssh 用户:密码@ip 可换到linux时,就不行了,在某些不适合使用公钥免密的情况下,到底该怎样免交互登陆? 于是我找到了sshpass ...