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的进程与线程非常有帮助.支持原创.尊重原创,分享知识! 上周碰到部署在 ...
随机推荐
- resutful的使用和增强版的swagger2
1.REST的特征 统一接口:客户和服务器之间通信的方法必须统一,RESUTFUL风格的数据元操作CRUD分别对应HTTP方法----GET用来获取数据源,POST用来新建资源,PUT用来更新资源,, ...
- PX01关于手机屏SPI触摸调试学习笔记
上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.xk-image. ...
- .Net Core - 使用事务IDbtransaction操作DBData
New一个流程 获取数据库连接字符串,实例化SqlConnection 打来数据库连接 Begin当前连接的事务(IDbTransaction) 操作数据库(操作数据库的时候一定要使用当前连接和事务修 ...
- jquery的toggle()函数,显示/隐藏交替
<!DOCTYPE html> <html lang="en"> <head> <script src="jquery.js&q ...
- Linux系统文件与启动流程
Linux系统文件与启动流程 /etc初始化系统重要文件 /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件 /etc/resolv.conf:Linux ...
- 最全iOS 上架指南
一.上架基本需求资料 1.苹果开发者账号(公司已有可以不用申请,需要开通开发者功能,每年 99 美元) 2.开发好的APP 二.证书 上架版本需要使用正式的证书 1.创建证书 Apple Develo ...
- 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...
- 论文笔记 - Noisy Channel Language Model Prompting for Few-Shot Text Classification
Direct && Noise Channel 进一步把语言模型推理的模式分为了: 直推模式(Direct): 噪声通道模式(Noise channel). 直观来看: Direct ...
- java学习之IO流
java io流有四大家族分别是: 1.InputStream(字节输入流) 2.OutputStream(字节输入出流)3.Reader(字符输入流)4.Writer(字符输出流)四个类都是抽象类 ...
- 字符编码 XUTF
/* * Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved. * Description: 上机编程 ...