如果知道進程號的話,直接去判斷/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);
}