爲了不進程發呆,或者陷入死循環,可是進程並無真正掛死,致使軟件看門狗沒有監控獲得進程掛死而重啓。線程
因此,添加一個喂狗自愈機制。blog
time_t lastTime = time(NULL);進程
for(耗時功能處理)get
{it
//喂狗
if(time(NULL) - lastTime >= 120)
{
lastTime = time(NULL);
Feed(600,"taskman"); //將當前進程喂狗
LOG(DEBUG_K,"---- Feed dog ----\n");
}io
}ast
#ifndef _SOFT_DOG_HPP_ #define _SOFT_DOG_HPP_ /////////////////////////////////////////////////////////////////////////// // // 因爲原有方案是被監控程序清計數器,監控程序(軟狗)加計數器,這種方案可能致使兩個進程同時操做一個文件,出現難以 // 預料的問題。所以,改爲一個進程寫,另一個進程讀的方案。爲實現此目的,特用系統運行時間做爲原來的計數器。 // 被監控程序喂狗時,只須要將喂狗時的系統運行時間寫入到文件中便可。監控程序在監控時,如發現文件中的系統運行時間與 // 「當前」系統運行時間差大於最大容許時間(dead_seconds), 判斷被監控程序出問題(沒有及時喂狗),監控程序將殺死被監控程序 ///////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <unistd.h> #include <sys/sysinfo.h> #define SOFT_WATCH_PATH "/var/volatile/watch" struct process_t { long up_time; long dead_seconds; int pid; char name[40]; }; //喂狗,若是超過dead_seconds秒沒有喂狗,則此進程將被重啓,爲防止頻繁操做文件, //建議增長定時器,使得調用Feed的間隔至少在5秒以上,同時要確保間隔小於最大喂狗時間, //process_name爲線程名,長度不能超過39個字符 inline bool Feed(unsigned short dead_seconds, const char *process_name) { int pid = getpid(); if(pid<1) { return false; } struct sysinfo info; if ( sysinfo( &info ) != 0 ) { return false; } struct process_t process = { info.uptime, dead_seconds, pid, "" }; memset( process.name, '\0', sizeof( process.name ) ); strncpy( process.name, process_name, sizeof(process.name) - 1 ); char filename[sizeof(SOFT_WATCH_PATH) + 10]; sprintf(filename, "%s/%d", SOFT_WATCH_PATH, pid); int fd = open(filename, O_RDWR | O_CREAT); if( fd < 0 ) { return false; } write(fd, &process, sizeof(process_t)); close( fd ); return true; } #endif // _SOFT_DOG_HPP_