spawn terminal en lisant son stdin

J’écris (sous Linux ou Windows + Cygwin) un programme Java qui doit exécuter une commande (processus P1) et lire sa sortie standard (qui est principalement constituée de données binarys utiles pour mon programme). C’est facile à faire et déjà fait.

Le problème est que P1 imprime également des informations de statut sur stderr, et je voudrais créer un terminal (comme xterm) pour le montrer de manière lisible par l’utilisateur. Y a-t-il une méthode facile pour le faire?

J’ai envisagé l’option de simplement alimenter quelques JTextArea avec la sortie de stderr, mais ce programme utilise des caractères de contrôle spéciaux (en particulier effacer la dernière ligne). Malheureusement, je n’ai pas trouvé de composant “Terminal (J)” disponible gratuitement.

Donc, le plus simple serait d’être capable d’ouvrir un xterm (P2) qui montre tout ce qui se trouve dans sa fenêtre, et de lancer un thread java en boucle err.read (P1) -> in.write (P2) pour tout transférer de stderr (P1) à stdin (P2).
Une autre option serait de pouvoir lancer quelque chose comme “xterm -e P1_command” et de continuer à capturer la sortie P1 …

Merci beaucoup pour votre aide!

PS: je voudrais restr aussi portable que possible, donc je ne suis pas sûr que rentrer dans / dev / pts soit une bonne idée

Sans comprendre complètement votre problème, la solution la plus simple que je puisse trouver est la suivante (bash remplacera $$ par l’ID de processus actuel, ce qui le rendra semi-unique). Je n’ai également aucune idée si cela fonctionne dans cygwin.

mkfifo /tmp/myoutput.$$ trap "rm /tmp/myoutput.$$" EXIT xterm -e cat /tmp/myoutput.$$ & runProgram 2>/tmp/myoutput.$$ 

Cela va libérer stderr sur un fifo, qui est lu par chat dans votre xterm.

Notez que le chat quittera chaque fois que vous fermez le fifo, donc si vous créez plusieurs instances de votre processus, vous aurez besoin d’un autre mécanisme de contrôle, et il existe probablement d’autres moyens plus simples pour le résoudre. Par exemple, lancer le tout dans un xterm pour commencer (y compris votre programme java), mais je suppose que ce n’est pas possible pour une raison quelconque ou si vous l’avez déjà essayé.

EDIT :
Je suppose que la méthode la plus courante consiste à transférer des informations dans un fichier journal, et à les tail , comme ceci:

 touch /tmp/myprogram.log xterm -e tail -f /tmp/myprogram.log & runProgram 2>/tmp/myprogram.log 

Cela devrait toujours fonctionner, mais vous risquez de perdre les messages de journalisation si tail démarre trop lentement (recherchez les indicateurs en queue pour faire écho à l’intégralité du fichier avant la mise en queue). Combinez-le avec un trap (et un nom de fichier «unique») pour supprimer le fichier et vous n’avez pas à vous soucier du nettoyage.

Quelle est la raison de ne pas exécuter l’application entière dans un xterm?