0

我正在尝试查找总文件描述符,并发现 sigar api 允许获取这些信息。但是,在尝试执行以下操作时

Sigar sigar = new Sigar();
sigar.getProcFd(<pid>);

如果抛出以下异常,则用实际进程替换 pid:

 org.hyperic.sigar.SigarNotImplementedException: This method has not been implemented on this platform
at org.hyperic.sigar.SigarNotImplementedException.<clinit>(SigarNotImplementedException.java:28)
at org.hyperic.sigar.ProcFd.gather(Native Method)
at org.hyperic.sigar.ProcFd.fetch(ProcFd.java:30)
at org.hyperic.sigar.Sigar.getProcFd(Sigar.java:531)

从异常中可以清楚地看出,本机方法 -gather() 尚未在我的操作系统(Mac OS X)上实现/可用。我该如何解决?我尝试将“libsigar-universal64-macosx.dylib”添加到类路径但没有运气。

另外,我尝试像下面这样创建 ProcFd,而不是从 sigar 获取它:

ProcFd proc = new ProcFd();
System.out.println("Total FD: " + proc.getTotal());

在这种情况下,输出始终为 0。根据 api 文档,它看起来应该提供打开文件描述符的总数(http://cpansearch.perl.org/src/DOUGM/hyperic-sigar-1.6.3 -src/docs/javadoc/org/hyperic/sigar/ProcFd.html)。由于与上述相同的原因(即缺少我的操作系统的实现),不确定它是否返回 0。那是对的吗?

另外,想知道为什么当 ProcFd 使用“sigar.getProcFd()”时会引发上述异常。但是当使用“ProcFd proc = new ProcFd()”创建时它不会,但是 proc.getTotal() 总是返回 0?

4

2 回答 2

0

我最终在 shell 脚本中使用 lsof 而不是使用 sigar 库。从来没有让这个在mac上工作。我在 Linux 中尝试过,它没有任何问题。

于 2015-05-08T16:25:23.993 回答
0

答案在文档中(http://cpansearch.perl.org/src/DOUGM/hyperic-sigar-1.6.3-src/docs/javadoc/org/hyperic/sigar/ProcFd.html),并根据您的发现:不支持 OSX。

getTotal

public long getTotal()
Get the Total number of open file descriptors.
Supported Platforms: AIX, HPUX, Linux, Solaris, Win32.

System equivalent commands:

AIX: lsof
Darwin: lsof
FreeBSD: lsof
HPUX: lsof
Linux: lsof
Solaris: lsof
Win32: 
Returns:
Total number of open file descriptors
于 2016-03-05T02:12:46.080 回答