我试图使用以下代码重定向在ProcessBuilder的帮助下启动的进程的输出
ProcessBuilder pb = new ProcessBuilder("/myScript >> /myLogFile 2>&1 <& - &");
Map<String, String> env = pb.environment();
env.clear();
env.put("var1", "val1");
env.put("var2", "val2");
pb.redirectErrorStream(true);
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
但它失败了,例外
线程"main"中的异常java.io.IOException:无法运行程序"/ myScript >>/myLogFile 2>&1 <& - &":java.io.IOException:error = 2,java.lang上没有这样的文件或目录.ProcessBuilder.start(ProcessBuilder.java:460)
当我传递"/ myScript"时,它工作正常
脚本是perl,有关它为什么失败的任何建议/评论?
我尝试将所有这些作为单独的参数传递,例如new ProcessBuilder("/myScript",">>","/myLogFile"),它执行但它不会重定向到日志文件,也不会使用envVars.
我的目标是根据我的要求从java运行SVN命令,因为我已经安装了TortoiseSVN命令行工具.在我的环境"Path"变量中添加了相应的路径"C:/ Program Files"/ TortoiseSVN/bin".
通过上面的设置,我可以使用说"svn --version"从windows命令行运行我的svn命令,它完全正常.
现在回到执行相同的代码,我正在使用processbuilder.但是我最终得到了上面的错误 - java.io.IOException:无法运行程序"svn --version":CreateProcess error = 2,系统找不到指定的文件.
我已经尝试过了,
使用ProcessBuilder.environment检查Path和PATH值.Path是emply,但是PATH配置了所有必需的应用程序路径,包括"TortoiseSVN/bin"路径.因此,清除ProcessBuilder的理论在其路径中没有可执行位置.
在执行时,我试图给出完整的路径,即"C:/ Program Files/TortoiseSVN/bin/svn.exe",而不仅仅是svn --version.这也给出了同样的错误.
我为其他可执行文件尝试了相同的代码,例如"java -version",它也因同样的异常而失败.
我现在有一种非常基本的感觉是不对的.但是现在尝试了一天以上,但是我没有得到任何线索.
还有一件事,我在Windows 7机器上运行它.
以下是我正在使用的代码,
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class RunningExecutable {
public static void main(String[] args){
String command = "svn --version";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ProcessBuilder svnProcessBuilder = new ProcessBuilder(command);
String PATH = svnProcessBuilder.environment().get("PATH");
System.out.println("PATH - " + PATH);
String path = svnProcessBuilder.environment().get("Path");
System.out.println("Path - " + path);
Process procObject = …Run Code Online (Sandbox Code Playgroud) 我需要执行一个外部应用程序,它返回大量数据(需要2个多小时才能完成)n并连续输出数据.
我需要做的是异步执行该程序并捕获文件中的输出.我尝试使用java进程构建器,但它似乎挂起并仅在程序退出或强制终止时返回输出.
我试图使用进程构建器并spwaned一个新的线程来捕获输出,但它仍然没有帮助.
然后我读了关于apache commons exec并尝试了同样的事情.然而,这也似乎需要很长时间并返回不同的错误代码(对于相同的输入)
CommandLine cmdLine = new CommandLine("/opt/testsimulator");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
PumpStreamHandler psh = new PumpStreamHandler(stdout);
ExecuteWatchdog watchdog = new ExecuteWatchdog(60*1000);
Executor executor = new DefaultExecutor();
executor.setStreamHandler(psh);
executor.setWatchdog(watchdog);
try {
executor.execute(cmdLine);
} catch (ExecuteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助或工作的例子都会非常有帮助
我一直在努力解决这个问题,我似乎无法修复它.我已经尝试过不同的方法(Runtime.exec(),ProcessBuiler),但似乎都没有.
这是我的问题.我有一台永远在线的笔记本电脑.这台笔记本电脑运行一个java工具连接到arduino通过USB打开和关闭房子里的灯.我自己创建了这个程序,因此我也在做一些定期的维护工作.最近我添加了一个按钮,从我的html界面重启程序(如果我有更新,或者由于某些其他原因我可能需要重新启动程序或我决定在不久的将来实现自动更新).
这背后的想法是从第一个实例启动应用程序的第二个实例,然后从System.exit(0)启动第一个实例.
由于某种原因,我无法启动应用程序的第二个实例.这是一些代码.
public void shutdown(boolean restart) {
if (this.serial != null) {
this.serial.disconnect();
}
if (restart) {
System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";
ProcessBuilder builder = new ProcessBuilder();
// String[] command = new String[1];
// command[0] = "-jar \"" + (System.getProperty("user.dir") + "/Home_Automation_Executor.jar") + "\"";
try {
// //System.out.println("Restarting Home Automation with command: " + command[0]);
// System.out.println("Restarting Home Automation with command: " + startupCommand);
// Runtime.getRuntime().exec("bash");
// Process proc = …Run Code Online (Sandbox Code Playgroud) 我有一个Java类,Runtime.exec()用于执行一个cscript进程,该进程具有String从数据库中检索的多个参数之一 .其中一个参数包括需要保留Runtime.exec()的换行符,但会删除换行符.使用时问题不存在ProcessBuilder,但我不必担心解析我的参数列表.
有没有办法在调用时保留换行符exec()?
如果有人想看到它,这里是一个简化的调用示例exec():
Process proc = Runtime.getRuntime().exec("cscript test.vbs \"line1\r\nline2\"");
Run Code Online (Sandbox Code Playgroud)
我的脚本将"line1 line2"作为一个参数,换行符替换为空格.
所以我正在开发一个在OSX/Linux上正常工作的跨平台引导程序,但在Windows中返回以下错误消息:
错误:无法创建Java虚拟机.错误:发生了致命异常.程序将会退出.无法识别的选项:-cp C:/myapp/realm/bin/Launcher.jar; C:/ MyApp的/ _jvm/JRE /../ LIB/tools.jar中; C:/ MyApp的/境界/共享/ LIB /码头-util的-8.1.4.v20120524.jar
如果我打印出我的ProcessBuilder Arguments列表并在命令行上运行这些参数,它将成功运行.命令应该是
C:/ myapp/_jvm/jre\bin\java -javaagent:C:/myapp/realm/bin/spring-agent.jar -cp C:/myapp/realm/bin/Launcher.jar; C:/ myapp/_jvm /jre/../lib/tools.jar;C:/myapp/realm/shared/lib/jetty-util-8.1.4.v20120524.jar -Xmx256m -Xms200m -Xss128k -XX:+ UseBiasedLocking -XX:+ UseNUMA -DprocessType = realm -Dcert.framework.license = C:/myapp/realm/license/my.license -Djav a.security.policy = C:/myapp/realm/security/java.policy -Djava.security.properties = C:/myapp/realm/security/java.security -Djava.secur ity.auth.login.config = C:/myapp/realm/security/jaas.conf -Drealm.home = C:/ MyApp的/境界-Duser. DIR = C:/ MyApp的/境界/ bin中-Djava.endorsed.dirs = C:/ MyApp的/境界/认可; C:/ MyApp的/ _jvm/JRE/LIB /核可-Djava.ext.dirs = C:/ MyApp的/ realm/ext; C:/ myapp/_jvm/jre/lib/ext -Dlog4j.configuration = file:C:/myapp/realm/conf/log4j.properties -Dorg.apache.commons.logging.Log =或g.apache .commons.logging.impl.Log4JLogger com.myapp.launcher.ProviderLauncher
我已经尝试在类路径周围放置引号,使用双斜线等等无法获得帮助将被赞赏..这里是代码:
Run Code Online (Sandbox Code Playgroud)String mainClass = args[0]; …
我想从我的Java servlet执行一个简单的Unix命令:我需要做的是对这个文件进行简单的echo写入:
echo HELLO > myfile.txt
Run Code Online (Sandbox Code Playgroud)
我在servlet中做的是:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletAutorecovery extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > ../webapps/test/myfile.txt");
pb.start();
} finally {
out.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws …Run Code Online (Sandbox Code Playgroud) 我知道有很多关于从java执行进程的问题.但是我无法使用提供的答案来解决我的问题.我正在尝试从java应用程序创建postgresql数据库备份.我使用以下代码
//ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:/PostgreSQL 8.2/bin/pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:/backup test/backups/test_27-1-2013_210.backup", "test"});
//ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:\\PostgreSQL 8.2\\bin\\pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:\\backup test\\backups\\test_27-1-2013_210.backup", "test"});
ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","\"D:\\PostgreSQL 8.2\\bin\\pg_dump.exe\"","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","\"D:\\backup test\\backups\\test_27-1-2013_210.backup\"", "test"});
Map<String, String> env = probuilder.environment();
env.put("PGPASSWORD", "mypass");
final Process process = probuilder.start();
Run Code Online (Sandbox Code Playgroud)
执行上面的代码后,我得到以下错误:
D:\PostgreSQL' is not recognized as an internal or external command,
operable program or batch file.
仅当备份文件的路径包含空格时才会出现问题,否则将创建备份.我试图在文件路径中使用斜杠和反斜杠,我引用文件路径,但每次都得到相同的错误.可以从命令提示符执行命令.
我做错了什么.ProcessBuilder中有关空格的参数数量是否有一些限制.谢谢
Process( Seq( "rm", "-r", "*" ), new File( "/some/dir" ) ) !
Run Code Online (Sandbox Code Playgroud)
此代码将失败(rm: *: No such file or directory),因为*通配符被解释为字符串值而不是unix通配符.是否有可能改变这种行为?
我可以在Linux上执行通常的命令,由processBuilder包装.但是我正在尝试运行Minecraft服务器,如下例所示,在命令之前设置了一些变量,并且它失败并出现异常.
final ProcessBuilder processBuilder = new ProcessBuilder("LD_LIBRARY_PATH=. ./bedrock_server");
processBuilder.directory(MC_PAL_LOCATION_DIR.toFile());
process = processBuilder.start();
Run Code Online (Sandbox Code Playgroud)
例外:
java.io.IOException: Cannot run program "LD_LIBRARY_PATH=. ./bedrock_server" (in directory "/home/user/Desktop/minecraft_bedrock_server_t"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at controller.Server.startMinecraftServer(Server.java:91)
at controller.Server.start(Server.java:58)
at Bootstrapper.bootServer(Bootstrapper.java:67)
at Bootstrapper.main(Bootstrapper.java:30)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 4 more
Exception in thread "Thread-0" java.lang.NullPointerException
at controller.ConsoleInput.run(ConsoleInput.java:16)
at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)
是否有可能将processBuilder用于此类命令?如果我将它直接粘贴到终端,该命令有效.
链接到服务器:https://minecraft.net/en-us/download/server/bedrock/
命令: LD_LIBRARY_PATH=. ./bedrock_server
processbuilder ×10
java ×9
process ×4
unix ×2
bash ×1
classpath ×1
cmd ×1
eclipse ×1
executable ×1
parameters ×1
runtime.exec ×1
scala ×1
servlets ×1
space ×1
windows ×1