2009-09-08 8 views
0

Cela peut sembler un peu gênant mais je veux démarrer un programme de console en Java mais dans sa propre fenêtre, tout en utilisant en même temps tee pour enregistrer la sortie dans un fichier journal . Je porte le programme qui fait cela de Perl à Java et j'ai des problèmes pour lancer le programme avec beaucoup d'argumments de commande. En Perl il utiliseDémarrage d'un programme externe en Java et tuyauterie sa sortie

system("dtterm -title $title -e /usr/bin/ksh -c \"". 
"cd $dir; ./$exec $arg | tee $exec.log \" &"); 

J'essaie d'utiliser la classe ProcessBuilder pour faire la même chose.

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e", 
"/usr/bin/ksh", "-c" "./" + exec, arg, "|", "tee", exec + ".log"); 
builder.directory(dir); 
Process process = builder.start(); 

Tout en faisant cela, le processus commence, il n'a pas tuyau dans le fichier journal aussi bien, mais il ne le Perl. J'ai essayé d'utiliser la méthode builder.getInputStream() mais comme il est affiché dans la fenêtre dtterm, il n'y a pas de sortie du processus de sortie.

Je dois avoir les fenêtres séparées parce que le programme lance plusieurs programmes différents en même temps, chacun avec leurs propres fenêtres. J'ai essayé de le lancer directement et d'envoyer la sortie de tous les processus à mon programme stdout mais il y en avait trop, il faut le garder séparé. S'il n'y a aucun moyen de le faire alors je vais devoir faire un JFrame qui montre la sortie des programmes mais je voudrais éviter cela si possible.

Merci

Répondre

1

Vous devez construire votre commande un peu différemment. Ce que vous voulez est:

dtterm -title <title> -e /usr/bin/ksh -c "./<exec> arg | tee <exec>.log" 

(notez les guillemets autour du paramètre à ksh.) Vous devez répliquer dans votre code:

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e", "/usr/bin/ksh", "-c", "./" + exec + " arg + " | tee " + exec + ".log"); 

Oui, cela semble très laid, et vous devez attention à échapper exec correctement au cas où il contient des caractères spéciaux comme l'espace ou des guillemets.

+0

Merci, ça n'a pas vraiment marché mais ça m'a conduit à ça. Comme dans le vôtre, tout ce qui est après -c doit être dans une chaîne concaténée mais il n'a pas besoin des guillemets dans la chaîne. Je ne sais pas pourquoi c'est mais je l'ai remarqué sur un autre processus où je spécifiais un titre, j'avais de nouveaux ProcessBuilder ("exec", "-title", "\" Titre du programme \ "") et le titre apparaissait avec Il a fallu que java les conserve et que java les garde tous comme un argument dans la chaîne –

+0

Vous avez raison, bien sûr, Java prend soin de s'assurer qu'un paramètre est donné au programme. en tant que paramètre unique, les guillemets ne sont pas nécessaires – Bombe

+0

Néanmoins, vous devez toujours éviter les caractères spéciaux. – Bombe

Questions connexes