You are on page 1of 10

En esta gua aprenderemos a obtener informacin de los recursos sistema en Java, usando la librera Sigar.

Los datos que podremos extraer son los siguientes: y Informacin de la CPU.
y y y y y y y y y

Espacio en disco disponible. Cantidad de espacio que consume un directorio en especfico. Cantidad de memoria RAM disponible y en uso. Informacin de red (direccin IP, nombre de la NIC, puertos abiertos, tablas de enrutamiento, etc.) Informacin de los procesos que se estn ejecutando en el sistema. Asignacin de variables de entorno. Uptime, o cantidad de tiempo que el equipo ha estado encendido. Nombre y versin del sistema operativo. Usuarios logueados actualmente.

Resaltadas en negrita est la informacin en la que nos concentraremos en el ejemplo. Pero antes aclaremos un poco que es Sigar: el API de Sigar nos proporciona una serie de mtodos que nos permiten obtener informacin del sistema operativo; consta de una librera de Java (.jar) y otras libreras nativas especficas para cada sistema operativo soportado (libsigar-amd64-linux.so , para Linux de 64 bits o sigar-x86-winnt.dll para Windows de 32 bits, por poner un ejemplo). Teniendo esto en cuenta, para hacer funcionar dicha API en una de nuestras aplicaciones, bastara con tener el archivo .jar y la librera especfica de nuestro sistema operativo. En el desarrollo del ejemplo se usar Eclipse y, aunque se explicar cmo aadir las libreras en el proyecto, se da por conocido el funcionamiento del flag --classpath de los comandos javac y java (obligatorio si no se usa ningn IDE).

El resultado
Siempre pongo primero el resultado ya que nos aclara la visin de hacia donde vamos, y de paso saber si lo que est aqu es lo que buscamos. Esta es la salida del programa en mi Gentoo Linux:
?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

====Informacion del sistema==== Descripcion del SO Gentoo 2.1.6 Nombre del SO Linux Arquitectura del SO x86_64 Version del SO 2.6.31-gentoo Nivel de parches unknown Fabricante Gentoo Version SO 2.1.6 Encendido durante: 6:15 ==== Informacion de la CPU ==== Fabricante: Intel Modelo Core(TM)2 Duo CPU Mhz 1994 Total CPUs 2 CPUs fisiscas 1 Nucleos por CPU 2 Tamanio cache 2048

T5750

@ 2.00GHz

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

Consumo de CPU 0 22.0% Consumo de CPU 1 2.0% Consumo total de CPU 6.0% ====Informacion del sistema de archivos==== dispos.|total|usado|disponible|%uso|dir|tipo /dev/root|24042944|10698228|12123376|47%|/|ext4 /dev/sda1|175457764|155825380|10719932|94%|/home|ext3 ====Informacion de la memoria==== Cantidad de memoria RAM: 3968MB Total: 4056984 Usada: 2307076 Disponible: 1749908 Memoria SWAP total: 1052248 Memoria SWAP usada: 0 Memoria SWAP libre: 1052248

Descargar Sigar
Puedes descargar Sigar de la ms. pgina incluye Puedes oficial: http://support.hyperic.com/display/SIGAR/Home que adems ejemplos para Java, Perl, C, Python, Ruby, y

adems descargar el cdigo fuente que se encuentra licenciado bajo la GPL2.

Creacin del proyecto en Eclipse


Voy a usar este ejemplo para adems ensear a manipular libreras externas en Eclipse; si lo que te interesa es conocer el cdigo, puedes saltarte a dicha seccin directamente. Creamos un proyecto en Eclipse llamado InfoSistema:

                 
A i t t .E li i i i l t l i l i l i Si t sigar-bin/lib , . ll, t . : t ll t : l , i l t lib

 

cp sigar-bin/lib/* /home/compartido/workspace/InfoSistema/lib/

           
A l t Si t .j , . l

li ,

Cabe resaltar que bastara con copiar el archivo llamado sigar.jar y la librera del sistema donde vamos linux.so en mi caso). a correr nuestro programa (libsigar-amd64-

Una vez hecha la copia, hacemos clic en la raiz del proyecto en Eclipse y presionamos F5 para actualizar el rbol de ficheros; de esta manera Eclipse sabr de los nuevos archivos que hemos copiado. Y lo que haremos a continuacin ser enlazar la librera sigar.jar a nuestro proyecto, para lo cual hacemos clic derecho en el mismo, Build Path -> Configure Build Path

En la ventana que aparece, seleccionaremos la pestaaLibraries y hacemos clic en el botn Add JARs Seleccionamos el archivo sigar.jar y hacemos clic en OK:

l li

tili

l API

Si

. P

Inform

n del sistem
t l l i

it

i f ,

l i t

ti

ll
?

InfoSO

, l l i i

it

t .

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

import org.hyperic.sigar.OperatingSystem; import org.hyperic.sigar.Sigar; import org.hyperic.sigar.SigarException; public class InfoSO { private Sigar sigar = new Sigar(); public void imprimirInfo() { OperatingSystem sys = OperatingSystem.getInstance(); System.out.println("Descripcion del SO \t" + sys.getDescription()); System.out.println("Nombre del SO \t\t" + sys.getName()); System.out.println("Arquitectura del SO \t" + sys.getArch()); System.out.println("Version del SO \t\t" + sys.getVersion()); System.out.println("Nivel de parches \t" + sys.getPatchLevel()); System.out.println( "Fabricante\t\t" + sys.getVendor()); System.out.println("Version SO \t\t" + sys.getVendorVersion()); try { imprimirUptime(); } catch (SigarException e) { e.printStackTrace(); } } public void imprimirUptime() throws SigarException { double uptime = sigar.getUptime().getUptime(); String resultado = ""; int dias = (int) uptime / (60* 60 * 24); int minutos, horas; if (dias != 0) resultado += dias + " " + ((dias > 1) ? "dias" : "dia") + ", ";

' ( ! "5
l l

E I RQ D G F G P I H G F E D "1"3 " %'" ) "B%$( "($ ' 3 "%!C ) % "!$ )% $ #! " " ( 6 '! %B " %!& 3 ( % 3 ) B "! %2 "3 % ' ' %1 ( 6 )"3! ( ! %( % & % 3! %2 ' ( %'" ) % ( % $ 5 ' "A 7 @ 87 9

%$ #

5 16) " '% )( ( % ' 3 %'" %)%! % ! "4 $ ' 3 %1 2 "1 1"0 " "! ( %$ )( % %' " ! %!& " %$ # "! 

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

minutos = (int) uptime / 60; horas = minutos / 60; horas %= 24; minutos %= 60; if (horas != 0) resultado += horas + ":" + (minutos < 10 ? "0" + minutos : minutos); else resultado += minutos + " min"; System.out.println("Encendido durante: \t" + resultado); } }

Aspectos importantes:
y y y

La clase que nos proporciona los del sistema operativo es OperatingSystem .

mtodos

para

recuperar

informacin

Con los mtodos getName y getDescription obtenemos el nombre del sistema operativo y descripcin (por ejemplo: nombre = Linux; descripcin = Gentoo 2.1.6). El mtodo getUptime de la clase Sigar nos permite conocer cuanto tiempo ha estado prendido el equipo analizado.

Informacin de la CPU
La siguiente clase nos permitir conocer el modelo del procesador, sus capacidades, la cantidad de ncleos y el uso de los mismos, etc. Creamos una nueva clase llamada InfoCPU con el siguiente cdigo:
?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

import import import import

org.hyperic.sigar.CpuInfo; org.hyperic.sigar.CpuPerc; org.hyperic.sigar.Sigar; org.hyperic.sigar.SigarException;

public class InfoCPU { private Sigar sigar; public void imprimirInfoCPU() { sigar = new Sigar(); CpuInfo[] infos = null; CpuPerc[] cpus = null; try { infos = sigar.getCpuInfoList(); cpus = sigar.getCpuPercList(); } catch (SigarException e) { e.printStackTrace(); } CpuInfo info = infos[0]; long tamanioCache = info.getCacheSize(); System.out.println("Fabricante: \t\t" + info.getVendor()); System.out.println("Modelo \t\t\t" + info.getModel());

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

System.out.println("Mhz \t\t\t" + info.getMhz()); System.out.println("Total CPUs \t\t" + info.getTotalCores()); if ((info.getTotalCores() != info.getTotalSockets()) || (info.getCoresPerSocket() > info.getTotalCores())) { System.out.println("CPUs fisiscas\t\t" + info.getTotalSockets()); System.out .println("Nucleos por CPU \t\t" + info.getCoresPerSocket()); } if (tamanioCache != Sigar.FIELD_NOTIMPL) System.out.println("Tamanio cache \t\t" + tamanioCache); System.out.println(""); for (int i = 0; i < cpus.length; i++) System.out.println("Consumo de CPU " + i + "\t" + CpuPerc.format(cpus[i].getUser())); try { System.out.println("Consumo total de CPU \t" + CpuPerc.format(sigar.getCpuPerc().getUser())); } catch (SigarException e) { e.printStackTrace(); } } }

Aspectos importantes:
y y y

Se deben usar objetos de CpuInfo y CpuPerc que proporcionan los mtodos para recuperar informacin del procesador. Dichos objetos se crean a partir de un objeto principal de tipo Sigar . Para extraer informacin acerca del procesador usamos los mtodos de la clase CpuInfo (por ejemplo getVendor o getModel ). Los datos especficos de cada ncleo de nuestro procesador se extraen con los mtodos de la clase CpuPerc (getUser para obtener el uso de un ncleo, por ejemplo).

Informacin del sistema de archivos


La siguiente clase nos permite obtener informacin del sistema de archivos: unidades montadas, espacio en disco, tipo de sistema de archivos, etc. Creamos una nueva clase llamada InfoSistemaArchivos con el siguiente cdigo:
?

01 02 03 04 05 06

import import import import import import import

org.hyperic.sigar.Sigar; org.hyperic.sigar.SigarException; org.hyperic.sigar.FileSystem; org.hyperic.sigar.FileSystemUsage; org.hyperic.sigar.NfsFileSystem; org.hyperic.sigar.SigarProxy; org.hyperic.sigar.SigarProx yCache;

07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

public class InfoSistemaArchivos { private SigarProxy proxy; private Sigar sigar; public InfoSistemaArchivos() { sigar = new Sigar(); proxy = SigarProxyCache.newInstance(sigar); } public void imprimirInfo() throws SigarException { FileSystem[] listaSistemaArchivos = proxy.getFileSystemList(); System.out.println(" \ndispos.|total|usado|disponible|%uso|dir|tipo \n"); for (int i = 0; i < listaSistemaArchivos.length; i++) imprimirSistemaArchivos(listaSistemaArchivos[i]); } public void imprimirSistemaArchivos(FileSystem sistemaArchivos) throws SigarException { long usado, disponible, total, porcentaje; try { FileSystemUsage uso; if (sistemaArchivos instanceof NfsFileSystem) { NfsFileSystem nfs = (NfsFileSystem) sistemaArchivos; if (!nfs.ping()) { System.out.println(nfs.getUnreachableMessage()); return; } } uso = sigar.getFileSystemUsage(sistemaArchivos.getDirName()); usado = uso.getTotal() - uso.getFree(); disponible = uso.getAvail(); total = uso.getTotal(); porcentaje = (long) (uso.getUsePercent() * 100); } catch (SigarException e) { // por ejemplo, si en al procesar D: \ en windows falla // con "Device not ready" usado = disponible = total = porcentaje = 0; } String porcentajeUso; if (porcentaje == 0) porcentajeUso = " -"; else porcentajeUso = porcentaje + "%"; System.out.print(sistemaArchivos.getDevName()); System.out.print("|" + total); System.out.print("|" + usado); System.out.print("|" + disponible); System.out.print("|" + porcentajeUso); System.out.print("|" + sistemaArchivos.getDirName()); System.out.println("|" + sistemaArchivos.getSysTypeName()); } }

57 58 59 60 61 62 63 64 65
Aspectos importantes:
y y y y

La clase que nos proporciona los mtodos para obtener informacin de una unidad en especfico es FileSystem . El mtodo getDevName nos devuelve el nombre del dispositivo referenciado por el objeto de la clase FileSystem . Los mtodos getTotal y getAvail devuelven un long que representa el espacio total del dispositivo y espacio disponible, respectivamente. Para conocer el tipo de sistema de archivos (ext4, ntfs, fat, btrfs, etc.) utilizamos el mtodo getSysTypeName .

Informacin de la memoria
La siguiente clase nos permite conocer la cantidad de memoria RAM que tiene el equipo, as como la que se est usando actualmente (tanto memoria fsica como virtual, aka, swap). Creamos una nueva clase llamada InfoMemoria con el siguiente cdigo:
?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

import import import import

org.hyperic.sigar.Mem; org.hyperic.sigar.Sigar; org.hyperic.sigar.Swap; org.hyperic.sigar.SigarException;

public class InfoMemoria { private Sigar sigar = new Sigar(); public void imprimirInfo() throws SigarException { Mem memoria = sigar.getMem() ; Swap intercambio = sigar.getSwap(); System.out.println("Cantidad de memoria RAM: "+ memoria.getRam() + "MB"); System.out.println("Total: "+enBytes(memoria.getTotal())); System.out.println("Usada: "+enBytes(memoria.getUsed())); System.out.println("Disponible: "+enBytes(memoria.getFree())); System.out.println("Memoria SWAP total: "+enBytes(intercambio.getTotal())); System.out.println("Memoria SWAP usada: "+enBytes(intercambi o.getUsed())); System.out.println("Memoria SWAP libre: "+enBytes(intercambio.getFree())); } private Long enBytes(long valor) { return new Long(valor / 1024); } }

24 25 26
Aspectos importantes:
y y y

La clase Mem nos proporciona mtodos para obtener informacin de la memoria del sistema. La clase Swap hace lo mismo que Mem, pero para la memoria virtual. Los mtodos getTotal y getUsed nos devuelven un long que representa (en bits) la cantidad de memoria del equipo y lo que est usando, respectivamente.

La clase main
El main de nuestro proyecto estar contenido en la clase InfoSistema :
?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17

import org.hyperic.sigar.SigarException; public class InfoSistema { public static void main(String[] args) { try { System.out.println("====Informacion del sistema===="); new InfoSO().imprimirInfo(); System.out.println(" \n==== Informacion de la CPU ===="); new InfoCPU().imprimirInfoCPU(); System.out.println(" \n====Informacion del sistema de archivos===="); new InfoSistemaArchivos().imprimirInfo(); System.out.println(" \n====Informacion de la memoria===="); new InfoMemoria().imprimirInfo(); } catch (SigarException e) { e.printStackTrace(); } } }

Eso es todo, solo nos queda ejecutar el proyecto y, opcionalmente, crear un archivo .jar para ejecutar en cualquier lado.

You might also like