喂狗機制 Software Dog

 

爲了不進程發呆,或者陷入死循環,可是進程並無真正掛死,致使軟件看門狗沒有監控獲得進程掛死而重啓。線程

 

因此,添加一個喂狗自愈機制。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_
相關文章
相關標籤/搜索