2011-05-13 14 views
7

Ho un programma java che esegue un altro programma (Python) come processo.Terminare l'esecuzione del processo con `exec` quando termina il programma

Process p = Runtime.getRuntime().exec("program.py", envp); 

Se il programma java termina l'elaborazione, anche il processo Python è terminato. Il comando finish invia un segnale al processo Python per chiuderlo.

Nella situazione normale processo è chiusa in questo modo:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
output.write("@EOF\n"); 
output.flush(); 

Tuttavia, quando il programma si blocca Java, il processo non è chiuso. Il comando di chiusura non viene inviato a causa dello schianto. È possibile terminare automaticamente il processo ogni volta che si termina il programma?

+0

In realtà sono davvero interessato anche alla risposta a questa domanda. Anche se non posso offrirlo, ti dispiace condividere perché il tuo programma Java si sta bloccando? – Vinay

+1

Affinché questa domanda sia rispondente, è necessario fornire ulteriori informazioni. Ad esempio: sei libero di modificare i sorgenti di uno o di entrambi i programmi Java e Python? –

+0

Dovrei essere in disaccordo su Vinay (haha stesso nome). In questo momento lo sto cercando, ma penso che qualcosa sulla falsariga di eseguire quel processo python solo mentre è in esecuzione l'attuale ID di processo Java farebbe il trucco. Non sono sicuro di essere sulla strada giusta, ma questa domanda mi incuriosisce davvero. – Vinay

risposta

2

Supponendo che in caso di arresto anomalo si intenda che il programma Java genera un'eccezione, vorrei solo terminare il processo Python quando ciò accade. Non ho visto il tuo codice, ma:

class Foo { 

    Process p; 

    private void doStuff() throws Exception { 
     p = Runtime.getRuntime().exec("program.py", envp); 
     // More code ... 
    } 

    private void startStuff() { 
     try { 
      doStuff(); 
     } catch (Exception e) { 
      p.destroy(); 
     } 
    } 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     foo.startStuff(); 
    } 
} 

Qualcosa del genere dovrebbe funzionare se solo eccezioni che causano il crash del programma fughe da doStuff().

Anche se non ci si aspetta che il programma si arresti in modo anomalo in questo modo, una volta terminato, ritengo che questo approccio sia preferibile, forse, al suo completamento in uno script di shell che in qualche modo uccide il processo Python. Gestirlo nel tuo programma è meno complesso e potrebbe anche essere una buona idea conservare il codice una volta che il programma è finito, dal momento che potresti ancora avere bug che non conosci.

+0

Questa non è una soluzione perfetta ma questo modello è sufficiente nel mio caso. – czuk

3

hey @czuk è un hook ShutdownHook essere utile? Questo tratterà i seguenti scenari

La macchina virtuale Java si spegne in risposta a due tipi di eventi:

  • Il programma si chiude normalmente, quando l'ultimo non-daemon thread esce o quando l'uscita (equivalentemente, System.exit) viene invocato, oppure

  • La macchina virtuale viene terminata in risposta a un interrupt utente, ad esempio digitando^C, o un evento a livello di sistema, come la disconnessione dell'utente o l'arresto del sistema.

Quando il sistema si arresta in modo imprevisto, non è così facile da catturare.

Utilizzare forse il metodo Thread.setDefaultUncaughtExceptionHandler?

+2

"Gli hook di shutdown dovrebbero anche terminare il loro lavoro rapidamente.Quando un programma richiama exit l'aspettativa è che la macchina virtuale si spenga e si spenga immediatamente. Quando la macchina virtuale viene chiusa a causa della disconnessione dell'utente o dello spegnimento del sistema il sistema operativo sottostante può consentire solo una quantità fissa di tempo in cui arrestare ed uscire.È quindi sconsigliabile tentare qualsiasi interazione dell'utente o eseguire un calcolo di lunga durata in un hook di chiusura. " L'uccisione di un processo Python non richiede molto tempo. Sembra la soluzione perfetta per l'OP (e placando il mio interesse). :) – Vinay

Problemi correlati