ps+grep判断进程是否存在

≯℡__Kan透↙ 提交于 2020-01-24 05:00:09

如果知道进程号的话,直接去判断/proc/下查找对应进程号文件是否存在即可(见5),但是当进程号不知道,只知道进程名称的时候,可以用这个方法。

有时候,我们在线上查日志定位问题的时候,经常会使用cat xxxx.log |grep yyyy命令,如果grep的时候,想排除某些字段,那么可以如下操作:

cat test.log | grep "login"|grep -v "deviceType"

上面的命令的意思是:找出test.log中包含login信息的,且没有deviceType这个字段的。

这个其实非常有用的,因为有些业务日志信息,就是以有没有传递某个字段,来做一些业务逻辑区分的。这个时候,就可以使用上面的命令来识别是哪些业务场景进来的。

 

1、grep xxx

同理,我们要判断进程是否存在时会用到ps,那么只想查看某个进程相关的,就可以用到 ps | grep mscore

~ # ps | grep mscore 
5747 root 1:33 mscore -qws 
6524 root 0:00 grep mscore

5747表示当前在运行的mscore进程,

6524表示grep的进程行

 

2、grep -v xxx

当我们不想看到6524这个干扰项的时候,我们可以把 grep 这个关键词过滤掉

因此可以使用 grep -v grep

~ # ps | grep mscore | grep -v grep 
5747 root 7:33 mscore -qws

这样就能过滤掉6524那行了。

 

3、wc -l

统计输出信息的行数,因为已经过滤得只剩我们想要的进程了,所以统计结果就是信息的行数,又由于一行信息对应一个进程,所以也就是进程的个数。

~ # ps | grep mscore | grep -v grep | wc -l 
1

 

4、输出到临时文件 > /tmp/abc

~ # ps | grep mscore | grep -v grep | wc -l > /tmp/abc 
~ # cat /tmp/abc 
1

这样代码中只要去读/tmp/abc的文件,看输出行数数值即可判断进程是否存在

#define TMP_FILE_PATH "/tmp/abc" 
int get_mscore_run_status() 
{ 
    int ret = 0; 
    FILE* fp = NULL; 
    char buffer[32] = {0}; 
    char cmd[256] = {0}; 
    do
    { 
        snprintf(cmd, sizeof(cmd), "ps | grep mscore| grep -v grep | wc -l >%s", TMP_FILE_PATH); 
        ms_system(cmd); 
        fp = fopen(TMP_FILE_PATH, "rb"); 
        if(!fp) 
            break; 
        fgets(buffer, sizeof(buffer), fp); 
        fclose(fp); 
        snprintf(cmd, sizeof(cmd), "rm -f %s", TMP_FILE_PATH); 
        ms_system(cmd); 
        if(!atoi(buffer)) 
            ret = 0; 
        else 
            ret = 1; 
    }
    while(0); 
    return ret; 
}

 

5、利用进程号判断进程是否存在

int ms_is_dir_existed(const char* dir) 
{
    struct stat buf = {0}; 
    if (!dir) 
        return 0; 
    if (lstat(dir, &buf) < 0) 
        return 0; 
    if (!S_ISDIR(buf.st_mode)) 
        return 0; 
    return 1; 
}

int mu_proc_exist(pid_t pId) 
{
    char sBuf[32] = {0}; 
    
    snprintf(sBuf, sizeof(sBuf), "/proc/%d", pId); 
    return ms_is_dir_existed(sBuf); 
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!