2014-04-20 23 views
2
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获取每个进程的进程时间。我得到这个错误:使用sigar无法获取进程时间

 
Exception in thread "main" java.lang.ExceptionInInitializerError 
at 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

回答

1

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

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); 
    } 
} 
+0

感谢答复..它是工作.. –

+0

但我实际的问题是如何避免“SigarExceptionPermissionDenied”?我知道..我应该写政策文件的许可。但如何写它,并在哪里发布? –

相关问题