如果知道进程号的话,直接去判断/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);
}
来源:CSDN
作者:虾虾林
链接:https://blog.csdn.net/y7u8t6/article/details/103830573