Как получить размер подкачки в Linux из / proc / swaps? - PullRequest
1 голос
/ 24 марта 2012

Я хочу разработать страницу JSF, которая может отображать размер подкачки, если операционная система Linux и какой процент используется.Я обнаружил, что эту информацию можно прочитать из / proc / swaps.Но когда я открываю его, я получаю это

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

Как я могу получить только там значения - 2047992 и 0?Я умею читать содержимое текстового файла.Например:

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

И еще один более сложный вопрос: что, если у меня есть два обмена?

С уважением

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Если вы решите проанализировать файл, вот одна из реализаций ...

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();
3 голосов
/ 24 марта 2012

Системный вызов (специфичный для 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 */
};

Из которых totalswap и freeswap могут быть тем, что вы ищете.

Я не знаю, как вы выполняете собственный вызов платформы в 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 :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...