标签: processbuilder

通过java在linux上的终端上执行命令

我创建了一个独立的应用程序,我希望当用户点击运行按钮时,终端应该打开,并且应该在终端上执行特定的命令.我可以使用以下代码成功打开终端...

Process process = null;  
try {  
    process = new ProcessBuilder("xterm").start();  
} catch (IOException ex) {  
    System.err.println(ex);  
}  
Run Code Online (Sandbox Code Playgroud)

上面的代码打开一个终端窗口,但我无法对其执行任何命令.谁能告诉我怎么做?

java linux terminal command processbuilder

8
推荐指数
2
解决办法
1万
查看次数

使用Java 7中的ProcessBuilder构建流程管道

我一直试图弄清楚如何使用new管道Java中的一些进程ProcessBuilder.我找不到一个合适的例子来说明我想做什么,当我尝试自己做这个过程时,这个过程就会挂起.我将非常感谢一些代码运行相当于cat test.txt | wc但不是通过shell的代码.

--Update--

好的,只是澄清一下.我知道有一些方法可以通过读写流来模拟管道.我想知道是否通过Java 7中引入的redirectInputredirectOutput方法以某种自动方式完成.

java pipe processbuilder

8
推荐指数
1
解决办法
3861
查看次数

ProcessBuilder找不到文件?!

快速连续的另一个问题,但这是一个我没有看到的非常明显的错误.我已经编写了一些代码来运行下面的批处理文件,但是我收到一条错误消息,说它无法找到该文件,但我可以向您保证该文件确实存在于该目录中!

public class Pull {

public void pullData() throws IOException {
    ProcessBuilder pb = new ProcessBuilder("adb.bat");
    File f = new File("C:\\");
    pb.directory(f);
    Process p = pb.start();  
}

 public static void main(String[] args) throws IOException {
     Pull pull = new Pull();
     pull.pullData();
 }
Run Code Online (Sandbox Code Playgroud)

}

这是错误信息

Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified
Run Code Online (Sandbox Code Playgroud)

java batch-file processbuilder

8
推荐指数
1
解决办法
2万
查看次数

如何将InputStream传递给ProcessBuilder

请转到第二次更新.我不想改变此问题的先前背景.

我正在使用Java应用程序中的wkhtmltoimage.

使用它的标准方法是 - path-to-exe http://url.com/ image.png.

根据他们的文档,如果我们写一个-而不是输入URL,输入转移到STDIN.

我正在使用ProcessBuilder- 开始这个过程-

ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);

Process process = pb.start();
Run Code Online (Sandbox Code Playgroud)

现在我无法弄清楚如何将输入流传递给此进程.

我有一个模板文件读入a DataInputStream,我在最后附加一个字符串:

DataInputStream dis = new DataInputStream (new FileInputStream (currentDirectory+"\\bin\\template.txt"));
byte[] datainBytes = new byte[dis.available()];
 dis.readFully(datainBytes);
 dis.close();

 String content = new String(datainBytes, 0, datainBytes.length);

 content+=" <body><div id='chartContainer'><small>Loading chart...</small></div></body></html>";
Run Code Online (Sandbox Code Playgroud)

我怎么管contentSTDIN过程中?

UPDATE ---

在Andrzej Doyle的回答之后:

我用过了getOutputStream()这个过程:

ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path);

    pb.redirectErrorStream(true); …
Run Code Online (Sandbox Code Playgroud)

java stdin processbuilder wkhtmltopdf java-io

8
推荐指数
3
解决办法
2万
查看次数

使用空格将多个参数传递给ProcessBuilder

我想将多个参数传递给processBuilder,并将参数分隔为空格.

这是命令,

String[] command_ary = {dir+"library/crc"," -s ", fileName," ",addressRanges};
Run Code Online (Sandbox Code Playgroud)

我需要在"fcrc"之后和"-p"之后以及"filename"和"addressRange"之间提供一个空格.

谢谢

java processbuilder

8
推荐指数
2
解决办法
4万
查看次数

如何将进程输出管道传输到Windows和JDK 6u45上的文件

我有以下Windows批处理文件(run.bat):

@echo off
echo hello batch file to sysout
Run Code Online (Sandbox Code Playgroud)

以下java代码,它运行批处理文件并将输出重定向到文件:

public static void main(String[] args) throws IOException {
    System.out.println("Current java version is: " + System.getProperty("java.version"));

    ProcessBuilder pb =
            new ProcessBuilder("cmd.exe", "/c",
                    "run.bat"
                     ,">>", "stdout.txt","2>>", "stderr.txt"
                    );
    System.out.println("Command is: " + pb.command());

    Process proc = pb.start();

    InputStream in = proc.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    int exitValue = proc.exitValue();
    System.out.println("Exit value: " + exitValue);
}
Run Code Online (Sandbox Code Playgroud)

在JDK上,包括JDK6u43,我得到以下输出:

Current …
Run Code Online (Sandbox Code Playgroud)

java jdk1.6 processbuilder

8
推荐指数
2
解决办法
1万
查看次数

使用System.console启动另一个进程

我有两个程序:

  • 首先,它使用Console对象来读写数据
  • 第二,应首先运行一些动态计算的参数

第二个程序代码如下所示:

String[] arguments = {
    "cmd", "/c",
    "java", "-cp", classPath
    lauchClass,
    // Arguments for first program
}
ProcessBuilder pb = new ProcessBuilder(arguments);
pb.environment().putAll(System.getenv());
pb.directory(workDir);
pb.inheritIO();

Process process = pb.start();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)

当第一个程序从第二个程序开始时,System.console()为空,它随NPE失败.

所以,问题是:有没有办法运行System.console()的另一个进程?

java process processbuilder

8
推荐指数
1
解决办法
456
查看次数

java.io.IOException:error = 11

我遇到了一个奇怪的Java问题ProcessBuilder.代码如下所示(略微简化)

public class Whatever implements Runnable
{

public void run(){
        //someIdentifier is a randomly generated string
        String in = someIdentifier + "input.txt";
        String out = someIdentifier + "output.txt";
        ProcessBuilder builder = new ProcessBuilder("./whateveer.sh", in, out);
        try {
            Process process = builder.start();
            process.waitFor();
        } catch (IOException e) {
            log.error("Could not launch process. Command: " + builder.command(), e);
        } catch (InterruptedException ex) {
            log.error(ex);
        }
}

}
Run Code Online (Sandbox Code Playgroud)

whatever.sh读取:

R --slave --args $1 $2 <whatever1.R >> r.log    
Run Code Online (Sandbox Code Playgroud)

大量的实例Whatever被提交到ExecutorService …

java linux process processbuilder

7
推荐指数
1
解决办法
1万
查看次数

如何在Windows中的ProcessBuilder java中设置PATH环境变量

我试图在java中为进程构建器设置PATH环境变量,我尝试了以下方法:

ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> mp = pb.environment();
mp.put("Path", "myPath");
pb.start();
Run Code Online (Sandbox Code Playgroud)

但是以下不起作用,进程构建器选择了默认的系统路径.我遇到了这个问题,这个技巧在我目前的项目中并没有帮助我.我该怎么办才能解决这个问题?

java environment-variables processbuilder

7
推荐指数
1
解决办法
1万
查看次数

从java中的ProcessBuilder调用时,EXE崩溃

我正在从JAVA ProcessBuilder调用一些EXE(7za.exe,pg_basebackup.exe,...).它在2或3天内没有任何问题(EXE将每天调用).之后,EXE不断崩溃.

7za.exe错误:
退出代码:: -1.073.741.502

Windows事件日志错误:
错误应用程序名称:7za.exe,版本:9.20.0.0,时间戳:0x4ce553f5错误模块名称:KERNELBASE.dll,版本:6.2.9200.21941,时间戳:0x5792e533
异常代码:0xc0000142
错误偏移量:0x000683ba
错误进程ID:0x10bc
错误应用程序启动时间:0x01d2cebdff3bb05a
错误应用程序路径:EXEpath\bin\7za.exe
错误模块路径:KERNELBASE.dll
报告ID:3d27046a-3ab1-11e7-93fe-00505680156e
错误包全名:
错误包相关应用程序ID:

代码段

File workingDir = new File(workingDirectory);
ProcessBuilder pb = new ProcessBuilder(argumentsList);
pb.redirectErrorStream(true);
pb.directory(workingDir);        
Process process = pb.start();
BufferedReader commandOutput = new BufferedReader(new 
InputStreamReader(process.getInputStream()));
String s = null;
while ((s = commandOutput.readLine()) != null) {
    print(s);
}
int exitCode = process.exitValue();
Run Code Online (Sandbox Code Playgroud)

在运行此代码的所有机器中也没有发生这种情况.是内存泄漏还是操作系统级错误?请指教.

提前致谢.

编辑1:c#中的同类错误.它还包含修复.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/cb9a15ed-4401-47f1-8c78-0c63c3da677d/process-returns-0xc0000142-when-started-from-a-windows-service-prividing- the credentials?forum = clr
如何在java中实现它?

编辑2:Java作为服务运行(使用包装器)
Java版本:1.0.051
Windows版本:Windows Server 2012和R2(64位),Windows 7(64位),Windows 8(64位)

java windows exe processbuilder

7
推荐指数
1
解决办法
296
查看次数