2012-03-23 4 views
1

私は、オペレーティングシステムがLinuxで、何パーセントが利用されている場合にスワップサイズを表示できるJSFページを開発したいと考えています。私はこの情報を/ proc/swapsから読むことができることを知りました。 2047992と0を - 私はそれを開いたときしかし、私は、私はちょうどそこに値を取得することができますどのようにこの/proc/swapsからLinuxのスワップサイズを取得するには?

Filename    Type  Size Used Priority 
/dev/sda2        partition 2047992 0 -1 

を取得しますか?私はテキストファイルの内容を読む方法を知っています。たとえば、:

try { 
    BufferedReader in = new BufferedReader(new FileReader("infilename")); 
    String str; 
    while ((str = in.readLine()) != null) { 
     process(str); 
    } 
    in.close(); 
} catch (IOException e) { 
} 

さらに2つのスワップがある場合、さらに高度な質問があります。

よろしく

答えて

3

あなたがファイルを解析することを決定した場合は、ここでは一つの実施...

Pattern pattern = Pattern.compile("([\\/A-Za-z0-9]+)[\\s]+([a-z]+)[\\s]+([0-9]+)[\\s]+([0-9]+)[\\s]+([\\-0-9]+).*"); 
BufferedReader reader = new BufferedReader(new FileReader("/proc/swaps")); 
String s = reader.readLine(); 
while (s!= null){     
    Matcher matcher = pattern.matcher(s); 
    if (matcher.matches()){ 
     System.out.println(s); 
     System.out.println(matcher.group(3)); 
     System.out.println(matcher.group(4)); 
    } 
    s = reader.readLine(); 
}    
reader.close(); 
+0

JNIを使​​用してsysinfoを呼び出す方が、おそらくより堅牢なソリューションです。 –

+0

はいこれが機能する場合があります。ありがとうございました! – user1285928

3

(Linux固有)システムコールsysinfo(struct sysinfo* info)は以下にinfoでいっぱい:あなたが後にあるかであるかもしれない

struct sysinfo { 
    long uptime;    /* Seconds since boot */ 
    unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ 
    unsigned long totalram; /* Total usable main memory size */ 
    unsigned long freeram; /* Available memory size */ 
    unsigned long sharedram; /* Amount of shared memory */ 
    unsigned long bufferram; /* Memory used by buffers */ 
    unsigned long totalswap; /* Total swap space size */ 
    unsigned long freeswap; /* swap space still available */ 
    unsigned short procs; /* Number of current processes */ 
    unsigned long totalhigh; /* Total high memory size */ 
    unsigned long freehigh; /* Available high memory size */ 
    unsigned int mem_unit; /* Memory unit size in bytes */ 
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ 
}; 

totalswapfreeswapのうち。

Javaでネイティブのプラットフォーム呼び出しをどのように行うのかわかりませんが、これは/proc/swapsファイルを自分で解析する良い方法です。

EDIT:

私はJNAでビットを果たし、この思い付いた:

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.Structure; 
import com.sun.jna.NativeLong; 

public class Test { 


    public interface CStdLib extends Library { 
     static class SysInfo extends Structure { 
      public NativeLong uptime; 
      public NativeLong[] loads = new NativeLong[3]; 
      public NativeLong totalram; 
      public NativeLong freeram; 
      public NativeLong sharedram; 
      public NativeLong bufferram; 
      public NativeLong totalswap; 
      public NativeLong freeswap; 
      public short procs; 
      public NativeLong totalhigh; 
      public NativeLong freehigh; 
      public int mem_unit; 
      /* some padding? */ 
     } 
     int sysinfo(SysInfo info); 
    } 

    public static void main(String[] args) { 
     CStdLib c = (CStdLib)Native.loadLibrary("c", CStdLib.class); 
     CStdLib.SysInfo s = new CStdLib.SysInfo(); 
     c.sysinfo(s); 
     System.out.println("totalram: " + s.totalram); 
    } 

} 

は、残念ながら、あなたは値が署名longのためには大きすぎるので、あなたの問題を持っているつもりです私のマシン上でスワップ値を読み込もうとしているときに、Javaで間違った値を取得する可能性があります。

希望すると便利です。 (警告:私はJavaプログラマ:)と混同されていなかった)

+0

非常に良い答えがあります!残念なことに私はJavaを初めて学んだので、Javaでコードを書くことを知らない。多分私はJNIを使​​うことができます。 – user1285928

+0

Linuxのパフォーマンスを監視するための便利なシステムコールはありますか?例えば、ネットワークセッションの総数? – user1285928

+0

ありがとう、私はLinuxを使用しています。 – user1285928

関連する問題