2017-08-08 6 views
0

J'essaye d'exécuter un script en utilisant Java et ProcessBuilder. Lorsque j'essaie de courir, je reçois le message suivant: error = 2, No tel fichier ou répertoire.Exécution d'un script shell à l'aide de ProcessBuilder

Je ne sais pas ce que je fais mal, mais voici mon code (ps: j'ai essayé d'exécuter juste le script sans arguments et l'erreur est la même:

String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""}; 
ProcessBuilder p = new ProcessBuilder(command); 

    try { 

     // create a process builder to send a command and a argument 
     Process p2 = p.start(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream())); 
     String line; 

     log.info("Output of running " + command + " is: "); 
     System.out.println("Output of running " + command + " is: "); 
     while ((line = br.readLine()) != null) { 
      log.info(line); 
     } 

    } 
+0

double possible de [Différence entre ProcessBuilder et Runtime.exec()] (https://stackoverflow.com/questions/6856028/difference-between-processbuilder-and-runtime-exec) – Steephen

Répondre

0

Essayez de remplacer

String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""}; 

avec

String[] command = {"/teste/teste_back/script.sh", argument1, argument}; 

Référez-ProcessBuilder pour plus d'informations.

ProcessBuilder (String ... commande)

Constructs un adjuvant de processus avec le programme du système d'exploitation spécifié et arguments.

+0

En fait, le problème était la citation sur la finale de ma chaîne et aussi avec des arguments. – Alvp

+0

@Alvp - N'est-il pas correctement abordé dans ma réponse? – Beginner

+0

Oui, c'est vrai. – Alvp

0

À moins que votre script.sh a une virgule dans son nom, qui est l'erreur:

String[] command = {"/teste/teste_back/script.sh" , argument1, argument}; 
0

Vous pouvez définir une méthode avec ProcessBuilder.

public static Map execCommand(String... str) { 
    Map<Integer, String> map = new HashMap<>(); 
    ProcessBuilder pb = new ProcessBuilder(str); 
    pb.redirectErrorStream(true); 
    Process process = null; 
    try { 
     process = pb.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    BufferedReader reader = null; 
    if (process != null) { 
     reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    } 

    String line; 
    StringBuilder stringBuilder = new StringBuilder(); 
    try { 
     if (reader != null) { 
      while ((line = reader.readLine()) != null) { 
       stringBuilder.append(line).append("\n"); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     if (process != null) { 
      process.waitFor(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    if (process != null) { 
     map.put(0, String.valueOf(process.exitValue())); 
    } 

    try { 
     map.put(1, stringBuilder.toString()); 
    } catch (StringIndexOutOfBoundsException e) { 
     if (stringBuilder.toString().length() == 0) { 
      return map; 
     } 
    } 
    return map; 
} 

Vous pouvez appeler la fonction d'exécuter la commande de script shell ou

String cmds = "ifconfig"; 
String[] callCmd = {"/bin/bash", "-c", cmds}; 
System.out.println("exit code:\n" + execCommand(callCmd).get(0).toString()); 
System.out.println(); 
System.out.println("command result:\n" + execCommand(callCmd).get(1).toString());