Como monitorar fim de um process que executa um comando em um computador remoto?

Boa tarde!

Eu possuo um método no qual recebo como parâmetro um comando de prompt e uma String[] contendo as variáveis de ambiente para a execução de tal comando.
O método funciona normalmente quando chamo ele para um comando local e sem variáveis de ambiente, como, por exemplo, um update no SVN. Ele executa e eu consigo saber quando ele foi concluído para assim poder incrementar uma progressbar.

No entanto, quando tento executar um comando que depende de um executável em um computador remoto, o mesmo faz o que tem que fazer mas eu não consigo capturar o final do processo. Alguém sabe como devo proceder?

Abaixo segue o código do método e em seguida duas chamadas, sendo a primeira a que funciona e a segunda que não consigo monitorar.

Desde já agradeço.

Este é o método

private Boolean executaComando(String comando, String[] variaveisDeAmbiente) throws IOException, InterruptedException {
        Process proc = Runtime.getRuntime().exec(comando, variaveisDeAmbiente);
        int exitVal = proc.waitFor();

        if (exitVal == 0) {
            return true;
        } else {
            return false;
        }
}

Esta chamada consegue ser executada e tem um retorno quando termina.

comando = "TortoiseProc.exe /command:update /path:\"" + txtCaminhoDoProjetoPortalSeven + "\" /closeonend:1";
                if (executaComando(comando, null)) {
                    current = 15;
}

Esta chamada consegue ser executada mas não consigo saber quando terminou.

String[] variaveisDeAmbiente = 
      {"ORACLE_HOME=\\\\BAHIA\\Oracle\\product\\11.2.0\\dbhome_1", "TNS_ADMIN="+System.getProperty("user.dir")};
comando = "\\\\BAHIA\\Oracle\\product\\11.2.0\\dbhome_1\\bin\\expdp.exe SEVEN/SEVEN@AWORKSDB "+
                  "DIRECTORY=BACKUP_AUTOMATIZADO_DIR DUMPFILE=BACKUP_"+formatador.format(data)+".DMP COMPRESSION=ALL "+
                  "logfile=BACKUP_"+formatador.format(data)+".LOG SCHEMAS=SEVEN";

if (executaComando(comando, variaveisDeAmbiente)) {
                    current = 50;
}

Ninguém tem uma luz para meu problema?
:roll:

Olá alanbravin!

Como não consegue capturar o final do processo?
sua instrução:
int exitVal = proc.waitFor();
Não retorna um valor ou exception??? fica travada lá??? ou retorna imediatamente??? :?

Dá uma olhada no que a documentação do método diz:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html#waitFor()

Segundo eles, se retorna imadiatamente, é porque o subprocesso já terminou :smiley:

Fica travado. Não dá exception nem finaliza.

Estranho, se fica travado, significa que o comando ainda está sendo executado :?

mas vc disse que o comando é executado com sucesso, só que o programa não libera a thread…

se vc abrir um prompt e digitar o mesmo comando que escreveu no código do programa, ele executa normalmente?

quero dizer, se vc por um break point na linha do Runtime.getRuntime().exec()
e copiar o valor da variável comando para um prompt e tentar executar, ele roda numa boa ou fica demorando tambem?

Sim, tanto pelo programa quanto pelo prompt funcionam perfeitamente a saída é essa (enquanto o comando é executado)

Export: Release 11.2.0.1.0 - Production on Mon Apr 30 17:15:30 2012

Copyright © 1982, 2009, Oracle and/or its affiliates. All rights reserved.
;;;
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting “SEVEN”.“SYS_EXPORT_SCHEMA_03”: SEVEN/********@AWORKSDB DIRECTORY=BACKUP_AUTOMATIZADO_DIR DUMPFILE=BACKUP_2012-04-30.DMP COMPRESSION=ALL logfile=BACKUP_2012-04-30.LOG SCHEMAS=SEVEN
Estimate in progress using BLOCKS method…
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 4.008 GB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TYPE/TYPE_SPEC
Processing object type SCHEMA_EXPORT/TYPE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TYPE/TYPE_BODY
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/EVENT/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/POST_TABLE_ACTION
Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
Processing object type SCHEMA_EXPORT/TABLE/MATERIALIZED_VIEW_LOG
Processing object type SCHEMA_EXPORT/JOB
. . exported “SEVEN”.“OCORRENCIA_ITEM” 290.2 MB 73547 rows
. . exported “SEVEN”.“OCORRENCIA” 16.33 MB 28036 rows
. . exported “SEVEN”.“DIC_LOG” 8.212 MB 153184 rows
. . exported “SEVEN”.“REQ_CONT_TESTE” 3.140 MB 4364 rows
. . exported “SEVEN”.“ARQUIVO_MAGNETICO_LOG” 1.630 MB 1656 rows
[Várias outras tabelas…]
. . exported “SEVEN”.“WEB_TIPOUSUARIO_FORMULARIO” 0 KB 0 rows
Master table “SEVEN”.“SYS_EXPORT_SCHEMA_03” successfully loaded/unloaded


Dump file set for SEVEN.SYS_EXPORT_SCHEMA_03 is:
F:\BACKUP_AUTOMATIZADO\BACKUP_2012-04-30.DMP
Job “SEVEN”.“SYS_EXPORT_SCHEMA_03” successfully completed at 17:19:32

:lol: que complicada essa sua situação

Faz um ultimo teste ai para verificar se o problema é mesmo monitorar fim de um process que executa um comando em um computador remoto

cria um arquivo batch: teste.bat

echo "Olá, apenas teste" ou qualquer outra coisa
e salva na maquina remota em: \BAHIA\Oracle\product\11.2.0\dbhome_1\bin
se for linux, cria um .sh de teste mesmo. (mas lembre de por a barra do linux em vez da barra invertida do windows)

ai tenta executar o comando:

[code] Process proc = Runtime.getRuntime().exec("\\BAHIA\Oracle\product\11.2.0\dbhome_1\bin\teste.bat");
int exitVal = proc.waitFor();

    if (exitVal == 0) {  
        return true;  
    } else {  
        return false;  
    }[/code]

se o programa não travar, ai é porque o problema ta no comando que vc ta tentando executar e não por ser em um comando em uma maquina remota

faz um teste desses ai, pode ser que te ajude a delimitar o escopo do erro :wink: