gpt4 book ai didi

java - 无法使用 sigar 获取处理时间

转载 作者:行者123 更新时间:2023-11-30 11:19:31 25 4
gpt4 key购买 nike

import java.io.IOException;
import org.hyperic.sigar.*;

public class SigarDemo {

public static void main(String args[]) throws SigarException, IOException
{

final Sigar sigar = new Sigar();
final long[] processes = sigar.getProcList();
ProcTime pt=new ProcTime();
for (final long processId : processes) {
ProcUtil.getDescription(sigar, processId);
pt=sigar.getProcTime(processId);
System.out.println("---"+pt.getStartTime());
}
}

我正在尝试使用 sigar 获取每个进程的处理时间。我收到此错误:

Exception in thread "main" java.lang.ExceptionInInitializerErrorat taskmanager.SigarDemo.main(SigarDemo.java:22)Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "sigar.nativeLogging" "read")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)at java.security.AccessController.checkPermission(AccessController.java:884)at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)at java.lang.System.getProperty(System.java:714)at org.hyperic.sigar.Sigar.(Sigar.java:78)

我试过策略文件设置所有权限。但我仍然遇到错误。我正在使用 netbeans 8.0。我已经设置了

-Djava.security.manager -Djava.security.policy=src/dir1/dir2/important.policy

最佳答案

我使用这段代码来获取处理时间

public static void main(String args[]) {
try {
final Sigar sigar = new Sigar();
final long[] processes = sigar.getProcList();
ProcTime pt = new ProcTime();
for (final long processId : processes) {
try {
ProcUtil.getDescription(sigar, processId);
pt = sigar.getProcTime(String.valueOf(processId));
System.out.println("---" + pt.getStartTime());
} catch (SigarException e) {
System.out.println("can't accessible...");
}

}

} catch (SigarException ex) {
ex.printStackTrace();
}

}

您不想在 VM 参数中指定安全策略文件来获取处理时间。但问题是 getProcTime() 不会返回 某些进程 id 的进程时间,因为 SigarPermissionDeniedException

但是您将毫无问题地获得某些进程的进程时间。

我从 bindings\java\examples 文件夹中的示例演示文件中得到了这个想法。我在下面稍作修改后将其发布。您可以编译并运行它以查看结果(它还包括处理时间)

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.ProcCredName;
import org.hyperic.sigar.ProcMem;
import org.hyperic.sigar.ProcTime;
import org.hyperic.sigar.ProcState;
import org.hyperic.sigar.ProcUtil;
import org.hyperic.sigar.cmd.Shell;
import org.hyperic.sigar.cmd.SigarCommandBase;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* Show process status.
*/
public class Ps extends SigarCommandBase {

public Ps(Shell shell) {
super(shell);
}

public Ps() {
super();
}

protected boolean validateArgs(String[] args) {
return true;
}

public String getSyntaxArgs() {
return "[pid|query]";
}

public String getUsageShort() {
return "Show process status";
}

public boolean isPidCompleter() {
return true;
}

public void output(String[] args) throws SigarException {
long[] pids;
if (args.length == 0) {
pids = this.proxy.getProcList();
}
else {
pids = this.shell.findPids(args);
}

for (int i=0; i<pids.length; i++) {
long pid = pids[i];
try {
output(pid);
} catch (SigarException e) {
this.err.println("Exception getting process info for " +
pid + ": " + e.getMessage());
}
}
}

public static String join(List info) {
StringBuffer buf = new StringBuffer();
Iterator i = info.iterator();
boolean hasNext = i.hasNext();
while (hasNext) {
buf.append((String)i.next());
hasNext = i.hasNext();
if (hasNext)
buf.append("\t");
}

return buf.toString();
}

public static List getInfo(SigarProxy sigar, long pid)
throws SigarException {

ProcState state = sigar.getProcState(pid);
ProcTime time = null;
String unknown = "???";

List info = new ArrayList();
info.add(String.valueOf(pid));

try {
ProcCredName cred = sigar.getProcCredName(pid);
info.add(cred.getUser());
} catch (SigarException e) {
info.add(unknown);
}

try {
time = sigar.getProcTime(pid);
info.add(getStartTime(time.getStartTime()));
System.out.println("this line has executed..!!!");
} catch (SigarException e) {
info.add(unknown);
}

try {
ProcMem mem = sigar.getProcMem(pid);
info.add(Sigar.formatSize(mem.getSize()));
info.add(Sigar.formatSize(mem.getRss()));
info.add(Sigar.formatSize(mem.getShare()));
} catch (SigarException e) {
info.add(unknown);
}

info.add(String.valueOf(state.getState()));

if (time != null) {
info.add(getCpuTime(time));
}
else {
info.add(unknown);
}

String name = ProcUtil.getDescription(sigar, pid);
info.add(name);

return info;
}

public void output(long pid) throws SigarException {
println(join(getInfo(this.proxy, pid)));
}

public static String getCpuTime(long total) {
long t = total / 1000;
return t/60 + ":" + t%60;
}

public static String getCpuTime(ProcTime time) {
return getCpuTime(time.getTotal());
}

private static String getStartTime(long time) {
if (time == 0) {
return "00:00";
}
long timeNow = System.currentTimeMillis();
String fmt = "MMMd";

if ((timeNow - time) < ((60*60*24) * 1000)) {
fmt = "HH:mm";
}

return new SimpleDateFormat(fmt).format(new Date(time));
}

public static void main(String[] args) throws Exception {
new Ps().processCommand(args);
}
}

关于java - 无法使用 sigar 获取处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23179094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com