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

Linux 查找某一线程是否已运行,并启动的方法的更多相关文章
- Linux 下让进程在后台可靠运行的几种方法
想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一 ...
- Linux下让进程在后台可靠运行的几种方法
想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一 ...
- linux 下线程错误查找,与线程分析命令
一. 使用top和jstack查找线程错误 我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu ...
- linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np
=============================================================== linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主 ...
- linux查找进程id端口占用和杀死进程
linux 查找进程id端口占用和杀死进程 ps 命令用于查看当前正在运行的进程 辅助上grep 用于搜索匹配ps -ef | grep java ps ax : 显示当前系统进程的列表 ps aux ...
- Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理
摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 记录一下Linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理.当用 ...
- 搭建Linux(Ubuntu)系统下的Differential Datalog运行环境
DDlog is a bottom-up, incremental, in-memory, typed Datalog engine. It is well suited for writing pr ...
- 以 DEBUG 方式深入理解线程的底层运行原理
说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到 JVM 了.其实大家明白了 Java 的运行时数据区域,也就明白了线程的底层原理,不过把这些东西明明白白写在纸面上的,网络上的文章并 ...
- [转载]了解Linux的进程与线程
本文转自Tim Yang的博客http://timyang.net/linux/linux-process/ .对于理解Linux的进程与线程非常有帮助.支持原创.尊重原创,分享知识! 上周碰到部署在 ...
随机推荐
- 记一次 .NET 某娱乐聊天流平台 CPU 爆高分析
一:背景 1.讲故事 前段时间有位朋友加微信,说他的程序直接 CPU=100%,每次只能手工介入重启,让我帮忙看下到底怎么回事,哈哈,这种CPU打满的事故,程序员压力会非常大, 我让朋友在 CPU 高 ...
- JS中对DOM元素的操作
https://www.runoob.com/jquery/jquery-ref-html.html 1.each 遍历 //遍历所有class为checksingle的DOM元素 $(" ...
- JavaScript 默认参数、动态参数、剩余参数
默认参数: <script> function selet(num, max) { console.log(num + max); } selet(1, 5); </script&g ...
- 再来一次,新技术搞定老业务「GitHub 热点速览 v.22.44」
上上周 Next.js 新版本火了一把,这不本周热点趋势就有了一个 Next.js 13 新特性构建的网站,虽然它只是个实验性项目.同样可以搞定一些业务的还有 lama-cleaner,不过它并不是个 ...
- Archlinux + Dwm 配置流程
本着学习C的态度来了解dwm,本身作为一个i3wm的追崇者,与dwm会擦出怎么样的火花呢? 下载安装dwm archlinuxcn源配置 编辑/etc/pacman.conf文件,添加bfsu的arc ...
- Java安全之CC3
前言 上一篇文章学习了Java中加载字节码的⼀些⽅法,其中介绍了TemplatesImpl,TemplatesImpl 是⼀个可以加载字节码的类,通过调⽤其newTransformer()⽅法,即可执 ...
- 【云原生 · Kubernetes】部署kube-apiserver集群
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 部署kube-apiserver集群 10.1 创建kube-apiserver 证书 10 ...
- mysql 在连接表中的要点
思路:分析需求,分析字段来自哪些表 (连接查询) 确定使用哪种连接查询? 确定交叉点(这两个表中哪些数据是相同的) 判断条件 such as 学生表中的 ...
- MongoDB - 事务支持
事务简介 事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作. ACID 是一个"真正"事务所需要具备的一组属性集合,指的是原子性(A ...
- 10 STL-list
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...