用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可以看到守護程序輸出的資訊.