drno-reg
@drno-reg
см не кратко

Как правильно снять значение нагрузки CPU с удаленного сервера windows или linux?

Здравствуйте.

Возникло желание написать приложение на java, которое может снимать статистику CPU с удаленного сервера Windows.

Покопался в интернете и нашел такой пример
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarLoader;
import org.hyperic.sigar.SigarException;

public class CpuInfo extends SigarCommandBase {

    public boolean displayTimes = true;
    
    public CpuInfo(Shell shell) {
        super(shell);
    }

    public CpuInfo() {
        super();
    }

    public String getUsageShort() {
        return "Display cpu information";
    }

    private void output(CpuPerc cpu) {
        println("User Time....." + CpuPerc.format(cpu.getUser()));
        println("Sys Time......" + CpuPerc.format(cpu.getSys()));
        println("Idle Time....." + CpuPerc.format(cpu.getIdle()));
        println("Wait Time....." + CpuPerc.format(cpu.getWait()));
        println("Nice Time....." + CpuPerc.format(cpu.getNice()));
        println("Combined......" + CpuPerc.format(cpu.getCombined()));
        println("Irq Time......" + CpuPerc.format(cpu.getIrq()));
        if (SigarLoader.IS_LINUX) {
            println("SoftIrq Time.." + CpuPerc.format(cpu.getSoftIrq()));
            println("Stolen Time...." + CpuPerc.format(cpu.getStolen()));
        }
        println("");
    }

    public void output(String[] args) throws SigarException {
        org.hyperic.sigar.CpuInfo[] infos =
            this.sigar.getCpuInfoList();

        CpuPerc[] cpus =
            this.sigar.getCpuPercList();

        org.hyperic.sigar.CpuInfo info = infos[0];
        long cacheSize = info.getCacheSize();
        println("Vendor........." + info.getVendor());
        println("Model.........." + info.getModel());
        println("Mhz............" + info.getMhz());
        println("Total CPUs....." + info.getTotalCores());
        if ((info.getTotalCores() != info.getTotalSockets()) ||
            (info.getCoresPerSocket() > info.getTotalCores()))
        {
            println("Physical CPUs.." + info.getTotalSockets());
            println("Cores per CPU.." + info.getCoresPerSocket());
        }

        if (cacheSize != Sigar.FIELD_NOTIMPL) {
            println("Cache size...." + cacheSize);
        }
        println("");

        if (!this.displayTimes) {
            return;
        }

        for (int i=0; i<cpus.length; i++) {
            println("CPU " + i + ".........");
            output(cpus[i]);
        }

        println("Totals........");
        output(this.sigar.getCpuPerc());
    }

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


НО он работает только на локальном сервере.
Подскажите каким образом его возможно использовать для съема значений с удаленного сервера windows или linux?

Либо может быть у вас есть другие варианты по-лучше. Буду рад их рассмотреть.

Заранее благодарю за ответы.

p.s. этот пример для localhost был найдет благодаря
stackoverflow.com/questions/47177/how-to-monitor-t...

Хотелось бы развить этот вопрос для REMOTE server.
  • Вопрос задан
  • 294 просмотра
Пригласить эксперта
Ответы на вопрос 2
Zabbix, nagios - системы для централизованного сбора статистики с хостов, как Win, *nix и прочего оборудования, поддерживающего SNMP.

Если стандартного набора скриптов этих систем будет недостаточно, они могут выполнять и вот такие скрипты как найденный вами, возвращая результат серверу мониторинга, где вы централизованно сможете смотреть сатистику по всем своим системам.
Ответ написан
drno-reg
@drno-reg Автор вопроса
см не кратко
нашел вариант для linux

package com.yeepay.g3.app.cd.utils;

import com.jcraft.jsch.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

private String ipAddress;

private String username;

private String password;

public static final int DEFAULT_SSH_PORT = 22;

public Test(final String ipAddress, final String username, final String password) {
    this.ipAddress = ipAddress;
    this.username = username;
    this.password = password;
}

public int execute(final String command) {
    int returnCode = 0;
    JSch jsch = new JSch();

    try {
        jsch.setKnownHosts("/Users/wtnull/.ssh/known_hosts");
        // Create and connect session.
        Session session = jsch.getSession(username, ipAddress, DEFAULT_SSH_PORT);
        session.setPassword(password);
        session.connect();

        // Create and connect channel.
        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);

        channel.setInputStream(null);
        BufferedReader input = new BufferedReader(new InputStreamReader(channel.getInputStream()));

        channel.connect();
        System.out.println("The remote command is: " + command);

        // Get the output of remote command.
        String line;
        while ((line = input.readLine()) != null) {
            System.out.println(line);
        }
        input.close();

        // Get the return code only after the channel is closed.
        if (channel.isClosed()) {
            returnCode = channel.getExitStatus();
        }

        // Disconnect the channel and session.
        channel.disconnect();
        session.disconnect();
    } catch (JSchException | IOException e) {
        e.printStackTrace();
    }
    return returnCode;
}

public static void main(final String [] args) throws Exception {
    Test sshExecutor = new Test("172.17.102.180", "root", "123456");
    sshExecutor.execute("free -m");
}

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы