ps+grep判斷進程是否存在

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

 

發佈了36 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章