Visualizzazione dei risultati da 1 a 4 su 4

Discussione: problema con waitFor()

  1. #1

    problema con waitFor()

    ho un programma java che viene eseguito su macchina unix.
    Questo programma java tra le altre cose, lancia uno script .sh che si occupa di effettuare la compressione di diversi files csv tramite il comando tar.
    Il programma ha sempre funzionato.
    Negli ultimi giorni è aumentato il numero di files csv da zippare (questo può influire sul metodo waitFor()?)
    e da quel momento il programma si blocca nel momento in cui deve effettuare
    il tar dei files csv (i relativi processi unix restano appesi).
    Il programma non riprende l'esecuzione fin quando non killo a mano i processi unix relativi al tar.


    Di seguito riporto il codice del metodo che lancia lo script:
    codice:
    public void backupTAR() throws IOException { 		
    try{ String cmd = path_file_scarico+"creaTAR.sh"; 			
    Runtime runTime = Runtime.getRuntime(); 			
    Process process = runTime.exec(cmd); 			
    exitVal = process.waitFor(); 			 			
    System.out.println("ExitValue backupTAR: " + exitVal);//restituisce valore 9 			 		
    }catch (Throwable t){ 
    	t.printStackTrace(); 	
    }
     		 }

    Ho cercato all'interno del forum e ho provato a inserire il seguente blocco dopo il waitFor(), ma senza successo:
    codice:
    InputStream is = process.getErrorStream();
    InputStreamReader isr = new InputStreamReader (is);
    BufferedReader br = new BufferedReader (isr);
    
    String line;
    while ((line = br.readLine()) != null){
    //MOMENTO IN CUI ATTENDE			
    }
    E' un problema di buffer?
    In che modo si può risolvere?

    grazie per l'attenzione

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non ho capito quale sia il problema.

    Per far terminare il programma Java devi killare a mano i processi tar... e mi pare che sia perfettamente in accordo con il metodo waitFor() (ovvero: attendi finchè il processo non è finito).

    Il metodo waitFor() attende che il processo lanciato sia terminato (per avere, ovviamente, l'exit-code del comando stesso e sapere se è terminato correttamente o meno).

    Il tuo waitFor() è chiamato su un processo che esegue un bash.

    A questo punto bisogna capire in che modo il processo tar viene lanciato dal bash. Se il processo viene lanciato "normalmente" (in foreground), il bash termina solo al termine del processo tar e subito dopo il waitFor() termina. Ovviamnte, se il processo tar rimane appeso per qualsivoglia motivo, il bash non terminerà mai, né terminerà mai di conseguenza la chiamata a waitFor().

    Se, al contrario, il tar viene lanciato dal bash in background (usando il & ), allora il bash termina subito e conseguentemente termina subito il waitFor().

    Se non ho capito nulla, prova a rispiegare.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Il processo tar è lanciato dallo script in foreground.
    Non penso che il numero di csv (passato da 292 a 300)possa influire sul tar, anche perchè la dimensione di tutti i csv è 1KB

    Non c'è un modo per verificare perchè il processo tar resti appeso?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: problema con waitFor()

    Originariamente inviato da Georges
    Ho cercato all'interno del forum e ho provato a inserire il seguente blocco dopo il waitFor()
    E' un problema di buffer?

    In che modo si può risolvere?
    Se il processo lanciato fa dell'output su standard-output/error, tale output va letto e "consumato" dalla applicazione Java. Altrimenti per questioni di buffer il processo avviato potrebbe bloccarsi.

    E questo (la lettura dell'output) va fatto o prima del waitFor (che è bloccante!) oppure in modo concorrente (con thread separati) al waitFor.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.