2011-06-24 7 views
-1

J'ai un fichier .sh stocké dans un système Linux. Le chemin complet du fichier est:Code Java pour exécuter un fichier .sh

/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh 

Je suis Tring pour l'exécuter par

Runtime.getRuntime().exec(`/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh`) 

mais il jette une exception. Je veux exécuter ce fichier à partir de mon programme Java dans un environnement MS-Windows; c'est possible?

+6

Il est impossible d'exécuter un script shell Unix en mode natif dans Windows, qui est ce que vous essayez de do - vous aurez besoin de convertir (pas seulement renommer) ce script shell Unix en un fichier de commandes Windows (avec une extension/suffixe de fichier .bat ou .cmd). Quelle exception est lancée?Quelle version de Java utilisez-vous? –

+2

Vous mentionnez ** à la fois ** un système Linux ** et ** un système Windows. Le script shell est situé sur votre système Linux, n'est-ce pas? Et votre application Java (qui devrait lancer le script shell) se trouve sur le système Windows. Est-ce exact? –

+4

Quelle est la "quelques exceptions". Ceci est une information importante! – dmeister

Répondre

2

Voici mon code. Comme le dit le commentaire, fonctionne sur Linux, échoue sur Windows (XP). AFAIK le problème avec Windows est que cmd.exe est bizarre en ce qui concerne ses paramètres. Pour votre sous-tâche spécifique, vous pouvez probablement l'utiliser en jouant avec des guillemets et en incorporant peut-être les paramètres de la sous-tâche dans la sous-tâche elle-même.

/** Execute an abritrary shell command. 
    * returns the output as a String. 
    * Works on Linux, fails on Windows, 
    * not yet sure about OS X. 
    */ 
public static String ExecuteCommand(final String Cmd) { 
    boolean DB = false ; 
    if (DB) { 
     Debug.Log("*** Misc.ExecuteCommand() ***"); 
     Debug.Log("--- Cmd", Cmd); 
    } 
String Output = ""; 
String ELabel = ""; 
    String[] Command = new String[3]; 
    if (Misc.OSName().equals("WINDOWS")) { 
     Command[0] = System.getenv("ComSPec"); 
     Command[1] = "/C"; 
    } else { 
     Command[0] = "/bin/bash"; 
     Command[1] = "-c"; 
    } 
Command[2] = Cmd; 
    if (DB) { 
     Debug.Log("--- Command", Command); 
    } 
    if (Misc.OSName().equals("WINDOWS")) { 
     Debug.Log("This is WINDOWS; I give up"); 
     return ""; 
    } 
try { 
     ELabel = "new ProcessBuilder()"; 
     ProcessBuilder pb = new ProcessBuilder(Command); 
     ELabel = "redirectErrorStream()"; 
     pb.redirectErrorStream(true); 
     ELabel = "pb.start()"; 
     Process p = pb.start(); 
     ELabel = "p.getInputStream()"; 
     InputStream pout = p.getInputStream(); 
     ELabel = "p.waitFor()"; 
     int ExitCode = p.waitFor(); 
     int Avail; 
     while (true) { 
      ELabel = "pout.available()"; 
      if (pout.available() <= 0) { 
       break; 
      } 
      ELabel = "pout.read()"; 
      char inch = (char) pout.read(); 
      Output = Output + inch; 
     } 
     ELabel = "pout.close()"; 
     pout.close(); 
    } catch (Exception e) { 
     Debug.Log(ELabel, e); 
    } 

    if (DB) { 
     Debug.Log("--- Misc.ExecuteCommand() finished"); 
    } 
    return Output; 
} 

}

+5

Vous ne devez pas avoir le premier caractère en majuscules pour les méthodes et variables en Java. –

1

J'ai fait un test rapide ici, les travaux suivants supposant que vous avez/bin/bash sur votre machine:

mon /tmp/test.sh:

#!/bin/bash 
echo `ls` 

mon code java:

try { 
    InputStream is = Runtime.getRuntime().exec("/bin/bash /tmp/test.sh").getInputStream(); 
    int i = is.read(); 
    while(i > 0) { 
     System.out.print((char)i); 
     i = is.read(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

sortie: tous les fichiers dans le répertoire en cours

modifier: j'ai un peu négligé que "exécuter à partir de Windows" commentaire. Je ne sais pas ce que tu veux dire avec ça.

3

Pour exécuter un script .sh sous Windows, vous devez disposer d'un interpréteur de commandes approprié. Par exemple, vous pouvez installer l'environnement Cygwin sur votre boîte Windows et utiliser son interpréteur bash.

Cependant, Windows n'est pas Linux même avec Cygwin. Certains scripts ne seront pas portés d'un environnement à l'autre sans modifications. Si j'avais un problème lors de l'exécution d'un script via Java dans un environnement Linux, je préférerais déboguer le problème dans cet environnement. Rappelez-vous, vous pouvez démarrer votre processus Java sur Linux en mode débogage et attacher votre débogueur IDE dans Windows à ce processus distant.

2

Merci à tous pour vos réponses. J'ai trouvé une solution au problème. Pour ce genre de situation, nous devons lier mon ordinateur Windows au système Linux. Voici le code qui a fonctionné:

public String executeSHFile(String Username, String Password,String Hostname) 
    { 
     String hostname = Hostname; 
     String username = Username; 
     String password = Password; 
     try{ 
      Connection conn = new Connection(hostname); 
       conn.connect(); 
       boolean isAuthenticated = conn.authenticateWithPassword(username, password); 
       if (isAuthenticated == false) 
       throw new IOException("Authentication failed."); 
       Session sess = conn.openSession(); 
       sess.execCommand("sh //full path/file name.sh"); 

       System.out.println("Here is some information about the remote host:"); 
       InputStream stdout = new StreamGobbler(sess.getStdout()); 
       BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); 
       while (true) 
       { 
        String line = br.readLine(); 
        if (line == null) 
         break; 
        current_time=line; 
        System.out.println(line); 
       } 

       System.out.println("ExitCode: " + sess.getExitStatus()); 
       /* Close this session */ 

       sess.close(); 

       /* Close the connection */ 

       conn.close(); 
     }catch(IOException e) 
     { 
      e.printStackTrace(System.err); 
      System.exit(2); 
     }finally{ 

     } 
} 

Merci.

+1

Vous utilisez les classes 'Connection' /' Session': de quelle bibliothèque proviennent-elles? –

0

Vous pouvez créer un fichier .bat (fichier batch), qui peut s'exécuter sous Windows. mettre le contenu du fichier .sh dans le fichier .bat lancer un processus à partir de votre application comme:

Process.Start("myFile.bat"); 
Questions connexes