Retorno do Proccess Runtime (maior q 512 bytes) trava waitFor

4 respostas
R

Olá pessoal.

Estou desenvolvendo uma aplicação, que via Java, eu chamo o grep do sistema operacional (nesse caso Windows) e quero pegar o retorno dele e enviar por e-mail. O problema é q quando esse retorno do grep passa de 512 bytes, o meu sw trava no método waitFor do Process…

Alguma explicação e/ou solição?

4 Respostas

B

Ola,

Vc está tomando o cuidado de executar este processo numa thread em separado?

Pois as vezes, quando vc executa tudo threadsafe ele trava mesmo…

R

Olá, obrigado pela resposta…

Mas não, não estou fazendo em Thread separada, pois é imprescindível q eu espere que o processo termine p/ continuar na execução do meu programa…

segue meu codigo:

Runtime rt = Runtime.getRuntime();
File tempFile = new File(System.getProperty("java.io.tmpdir") + System.currentTimeMillis() + ".txt");
String cmd = "grep -i \"" + search + "\" \"" + item.getAbsoluteFile() + "\" > \"" + tempFile.getAbsolutePath() + "\"";
System.out.println("Comando: " + cmd);
Process proc = rt.exec(cmd);
long ini = System.currentTimeMillis();
System.out.println("Iniciou waitFor");
int exitCode = proc.waitFor();
System.out.println("Tempo waitFor (" + exitCode + "): " + (System.currentTimeMillis()-ini));

e minha saída é essa:

Comando: grep -i "RAFAEL" "C:\Documents and Settings\rafaelq\Desktop\xxx.txt" > "C:\DOCUME~1\rafaelq\CONFIG~1\Temp\1231244458328.txt"
Iniciou waitFor

e fica no waitFor pra sempre… A não ser q eu vá no arquivo xxx.txt e diminua o nro de ocorrências da pesquisa do grep, aí sim, o waitFor finaliza normalmente, como deveria ser. Notei q o wait pára qnd o retorno do grep passa de 512 bytes…

Tenho como setar o tamanho desse buffer?!?

T

Tem certeza que conseguiu fazer o redirecionamento do grep? O comando de redirecionamento, no Windows, só funciona para cmd.exe (exemplo: cmd.exe /c “grep abc *.c > def” ) e no Linux/Unix só funciona para o shell (exemplo: “/bin/bash -c ‘grep abc *.c > def’”).

R

eh, realmente o redirecionamento não funcionou não…

Mas mesmo assim, o waitFor fica travado…

o que eu fiz foi não usar o waitFor, logo depois do exec, eu estou passando p/ o BufferedReader, e ele se encarrega de esperar a finalização da execução do comando. e mesmo depois dessa execução, eu dou um waitFor, ele diz q ainda tá executando. não sei o que é, mas tá resolvido. não usei o waitFor.

Valeu

Criado 6 de janeiro de 2009
Ultima resposta 6 de jan. de 2009
Respostas 4
Participantes 3