L'exécution de script bash à partir de java
mon problème est simple, lorsque j'essaie de le lancer .sh script à partir de Java, le script ne marche pas exécuter. Si je change mon script à une simple commande linux, telles que ls, il fonctionne parfaitement, donc je suppose que je suis en utilisant une mauvaise commande dans mon script, qui arrête l'exécution. S'il vous plaît aider.
David
De code 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;
êtes-vous sûr que votre script est défini comme l'exécutable ? peut-être chmod +x script.sh pourrait aider
Qu'espérez-vous obtenir? Votre script shell imprime rien sur la sortie standard, il redirige la sortie tous les fichiers. Ce qui est BufferedReader alors?
c'est un code à la con, écrire 3 fils pour l'entrée, de sortie et d'erreur de ruisseaux et de le faire de manière interactive, cela vous évitera de tout genre de problème
Qu'espérez-vous obtenir? Votre script shell imprime rien sur la sortie standard, il redirige la sortie tous les fichiers. Ce qui est BufferedReader alors?
c'est un code à la con, écrire 3 fils pour l'entrée, de sortie et d'erreur de ruisseaux et de le faire de manière interactive, cela vous évitera de tout genre de problème
OriginalL'auteur dawe134 | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Commencer par enlever le "bash" à partir du début de la commande.
Deuxième, je ne suis pas sûr que le shell n' #! interprétation lorsqu'il n'est pas utilisé de manière interactive. Je serais d'esprit pour passer directement à /bin/bash pour le moment de l'Exécution.exec() de l'appel.
Enfin, il suffit d'avoir un lecteur présent sur la sortie standard (stdout) n'est pas assez. Vous devez activement le lire, et de stderr, pour empêcher le processus de retrait, s'il écrit trop de sortie. Pour clarifier, vous êtes en attente pour le processus complet (
proc.waitFor()
) avant de traiter toute la sortie. Si le processus écrit trop de sortie avant de quitter, il va bloquer en attente pour vous de vider la mémoire tampon pendant que vous êtes bloqué à l'attendre à la sortie.Lire tous les 4 pages de cet article: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
OriginalL'auteur dty