2012-03-20 24 views
5

mój problem jest prosty, gdy próbuję uruchomić skrypt .sh z Javy, skrypt nie jest wykonywany. Jeśli zmienię skrypt na proste polecenie linuksowe, takie jak ls -all, działa idealnie, więc domyślam się, że używam złego polecenia w moim skrypcie, co zatrzymuje wykonanie. Proszę pomóż.Uruchomienie skryptu bash z java

David kod

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()); 
    } 

Bash skrypt:

#! /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

jesteś pewien skrypt jest ustawiony jako plik wykonywalny? może chmod + x script.sh może pomóc – Kiwy

+0

Czego oczekujesz? Twój skrypt powłoki nie wypisuje niczego na standardowe wyjście, przekierowuje wszystkie dane wyjściowe do plików. Po co jest BufferedReader? – zserge

+0

to głupi kod, napisz 3 wątki dla strumieni wejściowych, wyjściowych i błędów i rób to interaktywnie, to uratuje cię od wszelkiego rodzaju problemów –

Odpowiedz

2

start poprzez usunięcie 'bash' od początku polecenia.

Po drugie, nie jestem pewien, czy powłoka zrobi #! interpretacja, gdy nie jest używana interaktywnie. Byłbym przekonany, aby przejść bezpośrednio do/bin/bash dla wywołania Runtime.exec().

Na koniec, wystarczy, że czytelnik obecny na stdoutie nie wystarczy. Musisz aktywnie czytać z niego i ze stderr, aby zapobiec zawieszaniu się procesu, jeśli zapisuje zbyt dużo danych wyjściowych. Aby wyjaśnić, czekasz na zakończenie procesu (proc.waitFor()), zanim zajmiesz się dowolnym wyjściem. Jeśli proces zapisuje zbyt dużo danych przed wyjściem, blokuje czekanie na opróżnienie bufora, gdy jesteś zablokowany, czekając na jego zakończenie.

Przeczytaj wszystkie 4 strony tego artykułu: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

+0

Wielkie dzięki za porady, udało mi się go uruchomić z wykorzystaniem http: // www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1 wielkie dzięki. – dawe134