1. 程式人生 > >用Linux守護程序檢測某個程式是否執行

用Linux守護程序檢測某個程式是否執行

實現功能:

做的一個嵌入式板子開機會自啟動一個程式,但發現它工作數天後會退出。檢查記憶體使用並沒有洩漏,於是編寫了一個守護程序來不斷檢查程式是否執行,沒執行則執行它,這是一個折衷的辦法。

 

說明:

需要執行的程式是AlarmInterface,位於目錄/rf/下面。我做了一個指令碼DuiJiang來啟動這個AlarmInterface,並在指令碼中添加了觸控式螢幕支援。也就是說啟動DuiJiang就可以啟動AlarmInterface。檢測程式是否執行的方法是通過ps -w|grep AlarmInterface指令獲得AlarmInterface的程序,然後儲存在一個檔案中.檢查AlarmInterface程序是否執行即可判斷程式是否執行.

--------------------- 作者:jdh99 來源:CSDN 原文:https://blog.csdn.net/jdh99/article/details/7300641?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!

//守護程序,守護AlarmInterface程序
//作者:jdh
//時間:2012-2-27
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <syslog.h>
 
//程式名字
#define NAME "AlarmInterface -qws"
//查詢程序中程式名字
#define NAME_FIND "AlarmInterface"
//輸出目錄
#define DIR_OUT_FILE "/rf/out"
//要執行的程式
#define RUN_NAME "DuiJiang &"
 
//#define DIR_OUT_FILE "/rf/out"
//#define NAME "gnome-keyring"
//#define NAME_FIND "gnome"
//#define DIR_OUT_FILE "/root/test/out"
 
int daemon(int nochdir,int noclose)
{
    pid_t pid;
 
    //讓init程序成為新產生程序的父程序
    pid = fork();
    //如果建立程序失敗
    if (pid < 0)
    {
        perror("fork");
        return -1;
    }
    //父程序退出執行
    if (pid != 0)
    {
        exit(0);
    }
    //建立新的會話
    pid = setsid();
    if (pid < -1)
    {
        perror("set sid");
        return -1;
    }
    //更改當前工作目錄,將工作目錄修改成根目錄
    if (!nochdir)
    {
        chdir("/");
    }
    //關閉檔案描述符,並重定向標準輸入,輸出合錯誤輸出
    //將標準輸入輸出重定向到空裝置
    if (!noclose)
    {
        int fd;
        fd = open("/dev/null",O_RDWR,0);
        if (fd != -1)
        {
            dup2(fd,STDIN_FILENO);
            dup2(fd,STDOUT_FILENO);
            dup2(fd,STDERR_FILENO);
            if (fd > 2)
            {
                close(fd);
            }
        }
    }
    //設定守護程序的檔案許可權建立掩碼
    umask(0027);
 
    return 0;
}
 
//是否有匹配的字元,有則返回1,沒有返回0
//src:源字串
//dst:目標字串
//len:源字串被比較的長度
int match(char *src,char *dst,int len)
{
    int i = 0;
    int j = 0;
    int size_dst = 0;
 
    //獲得目標字串的長度
    size_dst = strlen(dst);
    //如果目標字串的長度大於len,返回失敗
    if (size_dst > len)
    {
        return 0;
    }    
    //開始比較
    for (i = 0;i < len;i++)
    {
        for (j = 0;j < size_dst;j++)
        {
            if (src[i + j] != dst[j])
            {
                break;
            }
        }
        if (j == size_dst)
        {
            return 1;
        }
    }
 
    return 0;
}
 
int main(int argc,char *argv[])
{
    int fd = 0;
    char buf[100];
 
    //開啟守護程序
    daemon(0,0);
 
    while (1)
    {
        //開啟日誌
        openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);
        
        //檢視程式是否執行
        //新建輸出檔案
        system("touch "DIR_OUT_FILE);
        //獲得程式ID
        system("ps -w|grep "NAME_FIND" >> "DIR_OUT_FILE);
        //開啟輸出檔案
        fd = open(DIR_OUT_FILE,O_CREAT|O_RDONLY,0777);
        //清空快取
        memset(buf,0,100);
        //讀取全部
        read(fd,buf,100);
        //判斷是否有程式檔案執行
        if (match(buf,NAME,90))
        {
            syslog(LOG_INFO,"jdh success!!!!!!!!!!");
        }
        else
        {
            syslog(LOG_INFO,"jdh fail!!!!!!!!!!");
            //執行程式
            system(RUN_NAME);
        }
 
        //休眠
        sleep(5);
        //刪除輸出檔案
        system("rm "DIR_OUT_FILE);
        
        //休眠
        sleep(55);
    }
 
    //關閉日誌
    closelog();
 
    return 0;
}
 
守護程序每分鐘檢測一次,用tail -f /var/log/messages可以看到守護程序輸出的資訊.