terça-feira, 15 de maio de 2012

Executar um comando no sistema operacional do host

Você já deve ter pensado em utilizar algum comando o sistema operacional para seus programas, não é? No meu caso, eu precisava usar o mysqldump para gerar automaticamente a exportação do meu banco de dados para backup.

A solução é simples, já que o Java nos dá todas as ferramentas para executar este comando. Não queremos somente executar o comando, mas gravar um log do que aconteceu. Podemos até mesmo interpretar este log e tomar alguma outra ação. No meu caso, mandar um email falando que o backup não funcionou.

O exemplo que eu vou apresentar abaixo não é do mysqldump, mas é simplesmente a saída de comando diskfree (df) no linux. Vamos lá!

/**
* Executa um comando simples no linux
* @author H3dema
*
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// classe principal para execucao do comando
public class DiskFree {
  public BufferedReader executa() {
    BufferedReader saidaComando = null;
    String[] linhaComando = null;
    // usamos a classe System para retornar o sistema operacional
    if (System.getProperty("os.name").equals("Linux")) {
      linhaComando = new String[2];
      linhaComando[0] = "df";
      linhaComando[1] = "-h"; // mostra "human readable"
    } else if (System.getProperty("os.name").equals("Solaris")) {
      linhaComando = new String[2];
      linhaComando[0] = "df";
      linhaComando[1] = "-k";
    }
    if (linhaComando == null) {
      return saidaComando; // não é um dos dois sistemas operacionais --> sai
    }

    Process fs = null;
    try {
      fs = Runtime.getRuntime().exec(linhaComando);
    } catch (IOException e) {
      e.printStackTrace();
      return saidaComando;
    }

    saidaComando = new BufferedReader(new InputStreamReader (fs.getInputStream()));
    return saidaComando;
  }

  public static void main(String[] args) {
    DiskFree df = new DiskFree();
    BufferedReader br = df.executa(); 
    String linhaDoBuffer = null;

    try {
      while ((linhaDoBuffer = br.readLine()) != null) {
        System.out.println(linhaDoBuffer);
      }
    } catch (IOException e) {
      System.out.println(e.getMessage());      
    }
  }
}

Neste programa utilizando algumas classes interessantes:
  • System.getProperty("os name") retorna uma String com o tipo do sistema operacional 
  • Para executar o programa usando uma classe Process que recebe o resultado de Runtime.getRuntime().exec(linhaComando)
  • A classe Process retorna um InputStream que permite receber os resultados do comando executado. No nosso exemplo, guardamos este resultado em um BufferedReader que nos permite apresentar o resultado do comando. Mas poderíamos ler estas linhas para poder executar alguma outra ação.

O resultado do comando executado é mostrado abaixo: