„Verwenden von ProcessBuilder zur Ausgabeumleitung'
P粉517090748
2023-08-24 20:26:08
<p>Ich versuche, die Ausgabe eines von ProcessBuilder gestarteten Prozesses mit dem folgenden Code umzuleiten: </p>
<pre class="brush:php;toolbar:false;">ProcessBuilder pb = new ProcessBuilder("/myScript >> /myLogFile 2>&1 <& - &");
Map<String, String>
env.clear();
env.put("var1", "val1");
env.put("var2", "val2");
pb.redirectErrorStream(true);
Prozess p = pb.start();</pre>
<p>Aber es schlug fehl und löste eine Ausnahme aus: </p>
<blockquote>
<p>Ausnahme im Thread „main“
java.io.IOException: Kann nicht ausgeführt werden
Programm
"/myScript>>
/myLogFile
2>&1 <& - &": java.io.IOException:
Fehler=2, Keine solche Datei oder kein solches Verzeichnis unter
java.lang.ProcessBuilder.start(ProcessBuilder.java:460)</p>
</blockquote>
<p>Wenn ich einfach „/myScript“ übergebe, funktioniert es einwandfrei. </p>
<p>Das Skript ist Perl. Gibt es Vorschläge/Kommentare dazu, warum es fehlschlägt? </p>
<p>Ich habe versucht, sie als separate Parameter wie <code>new ProcessBuilder("/myScript",">>","/myLogFile")</code> zu übergeben, und es hat funktioniert, aber es erfolgt keine Weiterleitung Protokolldateien, noch werden envVars akzeptiert. </p>
根据您的要求,从Java7开始,您可以继续使用ProcessBuilder,只需将可执行文件作为参数,并使用ProcessBuilder类中的
redirectInput()
、redirectOutput()
和redirectError()
来重定向/拦截其输出流。Shell重定向操作符在
ProcessBuilder
中是未知的。将您的命令放在一个shell脚本中并执行它,如这里所示。或者,使用bash -c
,如这里所示。