喂狗机制 Software Dog
生活随笔
收集整理的這篇文章主要介紹了
喂狗机制 Software Dog
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了避免進程發呆,或者陷入死循環,但是進程并沒有真正掛死,導致軟件看門狗沒有監控得到進程掛死而重啟。
所以,添加一個喂狗自愈機制。
time_t lastTime = time(NULL);
for(耗時功能處理)
{
//喂狗
if(time(NULL) - lastTime >= 120)
{
lastTime = time(NULL);
Feed(600,"taskman"); //將當前進程喂狗
LOG(DEBUG_K,"---- Feed dog ----
");
}
}
#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, '', 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_
總結
以上是生活随笔為你收集整理的喂狗机制 Software Dog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BIOS关闭网卡启动的方法电脑如何禁用网
- 下一篇: js 正则 非负整数