Incrontab 设置为监控大约 10 个目录。它所做的唯一一件事就是当其中一个目录中收到新文件时,它会启动一个 Bash 脚本。大约每 5 分钟在每个目录中收到一个文件。但是,incrond 偶尔会停止。没有规则何时会发生这种情况。它从每周几次到每月几次不等。记录的错误是:
incrond[35203]: *** unhandled exception occurred ***
incrond[35203]: polling failed
incrond[35203]: error: (11) Resource temporarily unavailable
incrond[35203]: stopping service
我知道我没有发布太多信息。但是,系统是封闭的,所以我分享了我能分享的内容。我不是在寻找直接的答案(因为问题可能太宽泛了)。我在寻找我可以研究的想法。这种行为的原因可能是什么?我应该检查什么?我应该查看哪些资源?
答案1
incrond
使用内核级inotify
子系统,将inotify
基于 C 的接口封装在 C++ 容器中。incrond 源文件,您遇到的错误似乎与incrond
C++ 类中封装的文件描述符的轮询失败有关:
int res = 轮询(ed.GetPollData(), ed.GetSize(), -1);
if (res > 0) {
ed.ProcessEvents();
}
else if (res < 0) {
switch (errno) {
case EINTR: // syscall interrupted - continue polling
break;
case EAGAIN: // not enough resources - wait a moment and try again
syslog(LOG_WARNING, "polling failed due to resource shortage, retrying later...");
sleep(POLL_EAGAIN_WAIT);
break;
default:
throw InotifyException("polling failed", errno, NULL);
}
}
很难确定轮询失败的确切原因。最常见的原因可能是:
- 超负荷的系统
incrond
某些功能崩溃/段错误
无论如何,你监控的目录下有多少个文件?
答案2
使用strace
命令,记录到文件,并根据您注意到故障发生的频率设置日志文件进行轮换。
例如,如果您花了一周的时间才发现它失败了,那么您的日志轮换必须保留 7 天(或更长时间)。如果您通常在一小时内意识到,那么每小时轮换 6 到 10 小时的日志就足够了。
更多相关信息和示例:http://www.thegeekstuff.com/2011/11/strace-examples