2010-11-19 7 views
1

tente d'exécuter un script, en utilisant ce morceau de code:script exécuté problème ProcessBuilder sh

String command = "./myScript.sh"; 
pb = new ProcessBuilder(command, param1, param2); 
pb.directory(directory); 
pb.start(); 

Je ne reçois aucune sorte d'erreur, mais ni les résultats supposés. Quoi qu'il en soit, j'ai essayé d'exécuter la même commande, direclty dans le terminal, et tout fonctionne correctement.
Ai-je raté quelque chose ??

Merci à l'avance

+0

d'où il n'a pas fonctionné? –

+1

'p = pb.start(); p.waitFor(); System.err.println ("exit with" + p.exitValue()); 'Qu'est-ce qu'il imprime? – khachik

+0

qu'est-ce que dataType est p ?? J'ai essayé System.out.println (pb.start(). ExitValue()); et aucune sortie à afficher –

Répondre

2

Le problème n'a pas été sur la façon dont j'ai appelé le script, ce qui était juste.
Mais c'était dans le script. Au début, il était:

#!/bin/bash 
inputFolder=$1 
outputFolder=$2 

cd $inputFolder 

for file in `ls ` ; do 
ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done 

Mais je me suis ffmpeg command not found, donc je l'ai changé:

#!/bin/bash 
inputFolder=$1 
outputFolder=$2 

cd $inputFolder 

for file in `ls ` ; do 
/usr/local/bin/ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done 

avec le chemin du trou. Mais j'ai encore des doutes, pourquoi est-ce nécessaire, si j'ai ffmpeg dans mon chemin et que je puisse exécuter dans la forme de la console n'importe quel répertoire ?? Si quelqu'un peut me donner une réponse, il sera le bienvenu :)

4

Lorsque vous démarrez un processus (pb.start()) vous rentrerez une instance Process. Si votre script lit l'entrée ou écrit la sortie sur stdout ou stderr, vous devez gérer cela sur des threads séparés en utilisant Process.getInputStream(), ...getOutputStream() et getErrorStream(). Si vous ne le faites pas, le processus peut être suspendu. Vous devez également appeler Process.waitFor() puis Process.exitValue() pour obtenir le statut de retour du processus. Si c'est un nombre négatif, le système n'a pas pu lancer votre script.

EDIT: Voici un court exemple simplifié. Ceci est un jouet seulement et fonctionnera de manière fiable que dans les conditions suivantes:

  1. Le script ne nécessite aucune entrée

  2. Le script ne produit pas une grande quantité de la production à la fois stdout et stderr. Si c'est le cas, puisque le programme lit tout stdout avant stderr, le tampon stderr peut se remplir et bloquer le processus. Dans une implémentation «réelle», vous liriez stdout et stderr dans des threads distincts (indice, enveloppez la méthode loadStream() dans une classe qui implémente Runnable).

 

public class PBTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     ProcessBuilder pb = new ProcessBuilder("sc","query","wuauserv"); 
     Process p = pb.start(); 
     String output = loadStream(p.getInputStream()); 
     String error = loadStream(p.getErrorStream()); 
     int rc = p.waitFor(); 
     System.out.println("Process ended with rc=" + rc); 
     System.out.println("\nStandard Output:\n"); 
     System.out.println(output); 
     System.out.println("\nStandard Error:\n"); 
     System.out.println(error); 
    } 

    private static String loadStream(InputStream s) throws Exception 
    { 
     BufferedReader br = new BufferedReader(new InputStreamReader(s)); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while((line=br.readLine()) != null) 
      sb.append(line).append("\n"); 
     return sb.toString(); 
    } 
} 
+0

pourriez-vous s'il vous plaît donnez-moi un exemple comment utiliser ces Process.getInputStream(), ... getOutputStream() ??? Process.exitValue() me donne une valeur possitive, mais mon script n'est pas en cours d'exécution. J'ai essayé: pb.directory (répertoire); \t \t \t \t \t pb.start(); \t \t \t \t \t Processus p = pb.début(); \t \t \t \t \t p.getInputStream(); \t \t \t \t \t p.getOutputStream(); \t \t \t \t \t int i = p.exitValue(); –

+0

J'ai ajouté un exemple simple –

+0

Merci, maintenant je peux voir l'erreur: ./script.sh: ligne 11: ffmpeg: commande introuvable Mais je ne comprends pas, parce que cette commande est installée, si je l'exécute le script directement dans la console, cela fonctionne. –

Questions connexes