Problemas com Process ao executar comandos do sistema

3 respostas
L

Bom dia!
Esstou fazendo um programinha que automatiza os processos de transmissão e conversão de video, bem simples e tal :

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Automat {
public static void main(String[] args) throws IOException
{
 int vezes;
 File arquivo = new File("log.txt");  
 arquivo.createNewFile();
 String ip,porta,arq;
 Scanner scan = new Scanner(System.in);
 System.out.println("Por favor, digite o numero de vezes:");
  
   //pede as informacoes
  vezes = scan.nextInt();
  System.out.println("Informe o Ip:");
  ip = scan.next();
  System.out.println("Informe a porta:");
  porta = scan.next();
  System.out.println("De um nome para o arquivo(SEM A EXTENSAO):");
  arq = scan.next();
 
 //entra no laco
 for(int x = 1;x<=vezes;x++)
 {
 
  //grava o primeiro comando
     String [] cmdGrava={"bash","-c","cvlc http://"+ip+":"+porta+" --sout "+arq+x+".mp4 vlc://quit"};
       
       
  //grava o comando que transforma o yuv para mp4
     String [] cmdTransforma={"bash","-c","ffmpeg -i "+arq+x+".mp4 "+arq+x+".yuv"};
        
       
 
  //grava o comando que gera os dados de comparacao da qualidade do videos transmitido para o video original
      String [] cmdCompara={"bash","-c","wine"," psnr 352 288 420 "+arq+x+".yuv "+arq+x+".yuv >> log.txt"};
       

      Runtime runtime = Runtime.getRuntime();
      Process process = runtime.exec(cmdGrava);
     
      Process process2 = runtime.exec(cmdTransforma);

      Process process3 = runtime.exec(cmdCompara);



 }//fim loop
 
} //fim main
}//fim prog

O problema é que ele só executa o primeiro comando, acho que ta faltando alguma coisa que force todos os processos a serem executados, por favor me deem uma luz, seria necessário usar o Processbuilder? Não entendi bem como funciona.
Muito obrigado!

3 Respostas

E

Quando você usa Runtime.exec e não usa “waitFor”, ele tenta deixar o processo rodando. Na prática, é como os três programas fossem disparados ao mesmo tempo, o que não é bom para você (onde você precisa executar primeiramente o cvlc, para então rodar o ffmpeg e por fim executar o psnr - não rodar os 3 ao mesmo tempo).

Como, pelo que vi, você precisa esperar o primeiro comando executar para executar então o segundo e o terceiro, há duas opções:

a) Usar o “waitFor” - procure aqui mesmo no GUJ um exemplo, ou

b) Criar um script bash que execute esses três comandos, e então executar via Java o script. Aí é o bash que se encarrega de esperar que o primeiro comando termine para executar o segundo, e assim por diante.

L

Opa! Obrigado, tava desconfiado disso =D
Então nesse caso, apos o waitFor o comando é executado e eu poderia usar a mesma instancia do process pra executar os 3 comandos? Ou eu teria que usar o destroy pra associar ao outro comando?

L

Gente, to tendo muita dificuldade, me ajudem pro favor!
executo os comando certinho, mas o comando do psnr quero jogar em arquivo so um valor, ai no comando uso o awk pra pegar so o numero que quero, para depois usar ele num calculo, mas não dá certo o awk, como posso fazer isso?

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Automat {
public static void main(String[] args) throws IOException, 
InterruptedException
{
 int vezes;
 File arquivo = new File("log.txt");  
 arquivo.createNewFile();
  File arquivo2 = new File("novo.txt");  
 arquivo2.createNewFile();
 String ip,porta,arq;
 Scanner scan = new Scanner(System.in);
 System.out.println("Por favor, digite o numero de vezes:");
  
   //pede as informacoes
  vezes = scan.nextInt();
  System.out.println("Informe o Ip:");
  ip = scan.next();
  System.out.println("Informe a porta:");
  porta = scan.next();
  System.out.println("De um nome para o arquivo(SEM A EXTENSAO):");
  arq = scan.next();
 
 //entra no laco
 for(int x = 1;x<=vezes;x++)
 {
 
    //grava o primeiro comando
     String [] cmdGrava={"bash","-c","cvlc http://"+ip+":"+porta+" --sout arquivo"+x+".mp4 vlc://quit"};
      
      
  //grava o comando que transforma o yuv para mp4
     String [] cmdTransforma={"bash","-c","ffmpeg -i arquivo"+x+".mp4 arquivo"+x+".yuv"};
       
      
 
  //grava o comando que gera os dados de comparacao da qualidade do videos transmitido para o video original
     String [] cmdCompara={"bash","-c","wine psnr.exe 352 288 420 "+arq+".yuv arquivo"+x+".yuv | awk '{print $10} 2>> log.txt"};
     
   
 
      Runtime runtime = Runtime.getRuntime();
      Process process = runtime.exec(cmdGrava);
      process.waitFor();
      Process process2 = runtime.exec(cmdTransforma);
      process2.waitFor();
      Process process3 = runtime.exec(cmdCompara);
      process3.waitFor();

 
 
 }//fim loop
 
} //fim main
}//fim prog
Criado 8 de maio de 2012
Ultima resposta 17 de mai. de 2012
Respostas 3
Participantes 2