Unter Windows kann ich den E / A meines untergeordneten Prozesses nicht zuverlässig manipulieren, wenn mein Programm über die Befehlszeile gestartet wurde. Es ist frustrierend, da Server standardmäßig eine Konsole für I / O verwenden. GUIs sind nett, aber ich würde wirklich lieber in der Befehlszeile bleiben und die Dinge einfach halten. Ich habe bemerkt, dass die Child-Prozess-I / O problemlos funktioniert, wenn ich meinen Server von der Eclipse-IDE ausführe, aber es ist eine ganz andere Geschichte, die von der Kommandozeile aus ausgeführt wird. Ich kann den Child-Prozess nicht lesen oder schreiben, aber der Prozess würde immer noch ausgeführt werden. Ich habe unten einen Testcode geschrieben, der dieses Problem demonstriert, und ich hoffe, dass das Problem auf einer anderen Maschine reproduziert werden kann und dann hoffentlich eine Lösung daraus wird. Bei der Ausführung von Eclipse funktioniert geerbte E / A wie erwartet. Bei Ausführung über die Windows-Eingabeaufforderung kann jedoch nichts in den untergeordneten Prozess gelesen oder geschrieben werden. In beiden Fällen ist das Umleiten der untergeordneten Prozessausgabe in eine Datei immer erfolgreich, die Eingabe kann jedoch nicht an das untergeordnete Element übergeben werden. Wenn es für dieses Problem bereits eine Lösung gibt, verlinken Sie bitte die Seite.
JRE / JDK-Implementierung:
%Vor%Betrachten Sie den folgenden Code:
%Vor%UPDATE: Ich habe den Test modifiziert, um einen beliebigen Befehl zur Laufzeit zu akzeptieren, und ihn auf meinen Linux-vps-Server hochgeladen. Ich habe es von einer SSH-Sitzung aus ausgeführt, und die E / A aller untergeordneten Prozesse können problemlos gelesen und beschrieben werden. Es gab eine Sache, die ich bemerkt habe. Als ich eine interaktive Bash-Shell als Kindprozess geöffnet habe und dann die Ausgabe in eine Datei umgeleitet habe, hat CentOS mein Programm gestoppt, denke ich. Das oder mein Programm ist abgestürzt.
%Vor%In der ersten Zeile tippe ich den Befehl ein. Die zweite Zeile ist die Bash-Shell, die erzeugt wurde, aber ich habe nie etwas eingegeben, so dass mein Programm es nach der Zeitüberschreitung tötet. Es wird für den zweiten Test vorbereitet, erstellt die Datei "piotest.txt" und stürzt dann ab oder wird vom Betriebssystem gestoppt. Der eigentliche Test selbst war unverändert, mit dem Unterschied, dass Sie im Test jetzt angeben können, welcher Befehl zur Laufzeit ausgeführt werden soll. Dies funktioniert in Linux, aber nicht in Windows. Ich hoffe, dass jemand, der die Win32-API kennt, irgendwie erklären kann, warum dieser Test in Windows fehlschlägt.
Haben Sie diesen Artikel gesehen? Ссылка
Es klingt für mich so, als müssten Sie die Eingabe / Ausgabe-Streams unter Windows warten. Der Artikel handelt von Runtime.exec, aber ich wette, der native Code für ProcessBuilder ist sehr ähnlich und hat den gleichen Typ von Problemen unter Windows.
Ich schätze, warum dies unter Eclipse unter Windows funktioniert, weil Eclipse die Streams in Ihrem Namen bedient, um Dinge in der Konsolenansicht anzuzeigen.
Ich weiß, dass ich zu spät auf die Beantwortung gestoßen bin, aber ich bin auf diese Frage gestoßen, bevor ich auf die Antwort gestoßen bin, und ich wollte jeden anderen im selben Boot retten, um etwas zu suchen.
Dies ist ein bekannter Bug für Windows: Ссылка
Sie können umgehen, indem Sie die Streams selbst umleiten:
%Vor%