小插曲 -- 使用Linux编写 判断程序是否在运行的小程序

2023-09-19 03:08:17

编写思路

首先,在执行“ps -elf |grep xxx”时,如果xxx存在,通常会有两条结果,一个是xxx对应的PID,一个则是grep对应的PID,但是如果我希望执行命令后,xxx存在就只有xxx对应的PID,不存在就什么都不显示的话,可以将指令修改成:“ps -elf |grep XXX|grep -v grep”,这样就可以屏蔽显示grep对应的PID,实现我想要的效果!

那么基于这个命令的特性,就可以编写一个判断程序是否正在运行的demo了,具体思路如下:

使用popen函数来执行“ps -elf |grep XXX|grep -v grep”,然后读取执行的结果,如果不为空且包含“XXX”,就说明程序正在运行!否则就是不在运行!

预备小知识点

strcat函数

【C库函数】strcat函数详解_爱躺平的威威的博客-CSDN博客

strstr函数

字符串操作函数strstr_白日曛的博客-CSDN博客

代码实现

在实际的运行中发现,如果程序不在运行,执行“ps -elf |grep XXX|grep -v grep”的运行结果打印出来最后都会有“00:00:00 ./ifrun XXX\n”(注意最后还有一个换行符) ,所以XXX最少会出现一次。(其实原因就是我写的代码ifrun也是一条进程,我把XXX作为参数传入后运行,而ps这条指令是找到所有带有XXX关键词的进程,我在ps指令里忽略了grep相关的结果,但没有忽略ifrun相关的结果,所以结果也会包含我现在ifrun的这个进程!也就是说,其实这里应该再次修改ps命令同时过滤grep和ifrun,这样结果就会很更干净,就可以使用本节开头使用的那套逻辑了,但是我反应的比较晚,就懒得改了,反之代码能实现我的要求就好)

对于这种情况,我采取了以下的方法来判断:

先用strstr,在popen执行的结果中查找XXX,并用cmp来保存返回值。

如果程序不在运行,此时cmp的值就应该是“XXX\n”,所以此时再判断cmp的长度,如果比XXX多了1,说明程序不在运行!反之,程序就在运行!

ifrun.c:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    FILE *file;
    char buffer[128] = {'\0'};
    char cmd1[64] = "ps -elf |grep "; //作为strcat的对象,必须为字符串“变”量
    char *cmd2 = "|grep -v grep";
    char *cmp = NULL;

    if(argc != 2){
        printf("wrong argc num!\n");
        return 1;
    }

    strcat(cmd1,argv[1]);
    strcat(cmd1,cmd2); //此时cmd1为 “ps -elf |grep XXX|grep -v grep”
    //  printf("cmd = %s\n",cmd1);

    file = popen(cmd1, "r");
    fread(buffer, sizeof(char), 128, file);

    cmp = strstr(buffer,argv[1]);

    if(strlen(cmp) != strlen(argv[1])+1){
        printf("%s is running\n",argv[1]);
    }else{
        printf("%s is NOT running\n",argv[1]);
    }
    printf("INFO:%s\n",buffer);

    return 0;
}

实现效果: 

编译:

然后尝试查看“test” 这个文件是否在执行:

显然,test没有在运行。

此时另开一个终端,随便写一个test.c,编译并运行test:

此时回到刚刚那个终端再次运行“./ifrun test” :

可见,此时程序就检测到了程序的运行,说明逻辑没有问题,代码编写成功!

更多推荐

Java 中 jps 命令

jps(JavaVirtualMachineProcessStatusTool)是Java开发工具包(JDK)中的一个命令行工具,用于查看Java虚拟机(JVM)中运行的Java进程的状态信息。它通常用于检查正在运行的Java应用程序的进程ID(PID)和相关信息,这对于调试和性能监控非常有用。以下是jps命令的使用示

LeetCode 之 长度最小的子数组

算法模拟:AlgorithmVisualizer在线工具:C++在线工具如果习惯性使用VisualStudioCode进行编译运行,需要C++11特性的支持,可参考博客:VisualStudioCode支持C++11插件配置长度最小的子数组LeetCode长度最小的子数组问题:给定一个含有n个正整数的数组和一个正整数t

CAN总线物理层

本文的目的并不是为了介绍或普及CAN总线相关知识,而是为了了解CAN总线,进而为CAN通信一致性测试做知识储备。CAN,控制器局域网,全称:ControllerAreaNetwork。1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量”、“通过多个网络进行大量

vue学习-03vue父子组件与ref属性

本篇开始,我们将复习一下上篇的组件引入:App.vue<template><div><imgsrc="./assets/logo.png"alt="logo"><!--编写组件标签--><School></School><Student></Student></div></template><script>//引入组件

CSS中的定位

position的属性与含义CSS中的position属性用于控制元素在页面中的定位方式,有四个主要的取值,每个取值都会影响元素的布局方式,它们是:static(默认值):这是所有元素的初始定位方式。在静态定位下,元素会按照它们在文档流中的顺序依次排列,不受top、right、bottom、left等属性的影响。静态定

c++11相关内容介绍

前言在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯意性的将两个标准合并称为C++98/03标准。从C++0x到

力扣669 补9.16

最近大三上四天有早八,真的是受不了了啊,欧嗨呦,早上困如狗,然后,下午困如狗,然后晚上困如狗,尤其我最近在晚上7点到10点这个时间段看力扣,看得我昏昏欲睡,不自觉就睡了1个小时,可能在犯困的时间段不适合做高难度的题目。还有英语也要抓紧搞,好久没搞英语了,力扣每天一题就搞得我没时间搞别的了,基本就是下午在看力扣,然后睡了

基于Spring Boot的房屋租赁系统

目录前言一、技术栈二、系统功能介绍租客功能模块的实现​编辑管理员功能模块的实现三、核心代码1、登录模块2、文件上传模块3、代码封装前言房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于SpringBoot的房屋租赁系统。本文

Android Studio导入aosp源码

1、在Ubuntu系统下,进入源码根目录,运行如下命令:sourcebuild/envsetup.sh#初始化环境变量。lunchsdk_phone_x86_64makeidegen-j6#六核编译idegen模块忽略此命令:mmmdevelopment/tools/idegen/#此命令可以不执行(同makeideg

【leetcode】数组排序

【leetcode】数组排序task03主要了解了数组中常见的排序方法:1.常见数组排序方法冒泡排序(BubbleSort):冒泡排序是一种简单的排序算法,它多次遍历数组,比较相邻的元素并交换它们,直到整个数组按升序排列。时间复杂度为O(n^2)。选择排序(SelectionSort):选择排序是一种简单的排序算法,它

基于Spring Boot的网上购物商城系统

目录前言一、技术栈二、系统功能介绍用户功能模块的实现管理员功能模块的实现商家功能模块的实现三、核心代码1、登录模块2、文件上传模块3、代码封装前言本课题是根据用户的需要以及网络的优势建立的一个基于SpringBoot的网上购物商城系统,来满足用户网络购物的需求。本网上购物商城系统应用Java技术,MYSQL数据库存储数

热文推荐