2012-03-20 19 views
5

il mio problema è semplice, quando provo a eseguire lo script .sh da Java, lo script non viene eseguito. Se cambio il mio script in un semplice comando linux, come ls -all, funziona perfettamente, quindi suppongo che sto usando un cattivo comando nel mio script, che interrompe l'esecuzione. Per favore aiuto.Esecuzione di script bash da java

David codice

Java:

String cmd = "bash /home/david/burza/getter.sh"; 

    try { 
     Process proc = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd}); 
     BufferedReader read = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
     try { 
      proc.waitFor(); 
     } catch (InterruptedException e) { 
      System.out.println(e.getMessage()); 
     } 
     while (read.ready()) { 
      System.out.println(read.readLine()); 
     } 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 

script Bash:

#! /bin/bash 

wget -O data1.html http://www.rmsystem.cz/kurzy-online/akcie/easyclick; 
touch ext_data.txt; 

grep 'table class="tbl1"' ./data1.html | tr '<td>' ' ' | tr '-' 'A' | grep -o -w '[0-9, ]*' | sed 's/ *//g' | sed '/^$/d' | tr ',' '.' > ext_data.txt; 

lines=`wc -l ext_data.txt | grep -o '[0-9]*'`; 

(echo $lines; cat ext_data.txt) > ext_data.txt.new && mv ext_data.txt.new ext_data.txt; 
+0

Sei sicuro che il tuo script è impostato come eseguibile? forse chmod + x script.sh potrebbe aiutare – Kiwy

+0

Cosa ti aspetti di ottenere? Lo script della shell non stampa nulla per lo stdout, reindirizza tutto l'output ai file. Per cosa allora BufferedReader? – zserge

+0

questo è un codice stupido, scrivere 3 thread per input, output e flussi di errore e farlo in modo interattivo, questo ti salverà da ogni tipo di problema –

risposta

2

Inizia rimuovendo la 'bash' dall'inizio del comando.

In secondo luogo, non sono sicuro che la shell faccia #! interpretazione quando non utilizzata in modo interattivo. Sarei disposto a saltare direttamente a/bin/bash per la chiamata Runtime.exec().

Infine, avere semplicemente un lettore presente sullo stdout non sarà sufficiente. È necessario leggere attivamente da esso e da stderr per impedire che il processo si blocchi se scrive troppo output. Per chiarire, stai aspettando il completamento del processo (proc.waitFor()) prima di affrontare qualsiasi output. Se il processo scrive troppo output prima di uscire, bloccherà l'attesa di svuotare il buffer mentre sei bloccato in attesa che esca.

Leggi tutte le 4 pagine di questo articolo: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

+0

Mille grazie per i tuoi consigli, sono riuscito a farlo funzionare usando l'http: // www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1 grazie mille. – dawe134