标签: processbuilder

通过processbuilder运行脚本

我正在尝试从java程序运行Python,Ruby,C,C++和Java脚本,并且向我建议使用Processbuilder作为运行脚本的好方法.根据我的理解,Processbuilder主要运行本机文件(Windows上的.exe等).但是,我听说过使用Processbuilder运行脚本(非本地)文件的一些事情.不幸的是,我在这个主题上发现的一切都非常模糊.

如果有人可以澄清一种运行非本地脚本的方法,比如Python,Ruby等,我将非常感激!

java scripting processbuilder

5
推荐指数
1
解决办法
4365
查看次数

需要有关 Solaris 下 Java ProcessBuilder 性能的帮助

我的问题是,JVM 是否共享某种与线程或进程相关的资源,这些资源可能会导致 ProcessBuilder 性能在正常使用一个月或更长时间后出现峰值?对所有应用程序使用 java 6 update 21。

在过去的几个月中,我们注意到数据中心中的单个服务器(运行 Solaris 10 的 Sparc M4000)可以运行大约 6-8 周而不会出现任何问题。然而,使用 ProcessBuilder 类运行脚本的应用程序的性能很快就会受到巨大的影响 - ProcessBuilder.start 有时需要一分钟多的时间才能返回。重新启动后,以及几周后,正常返回时间在 10 秒或可能 100 毫秒范围内。

我编写了一个单独的小应用程序,它创建了 5 个线程,每个线程使用 ProcessBuilder 连续运行“ls”命令 10 次,然后我从中收集统计信息以监控原始问题。该应用程序在每次运行后退出,并且每小时仅从 cron 运行一次。通常只需要一两秒钟。

昨晚,经过 45 天的正常运行时间和正常行为后,每次 ProcessBuilder.start 调用的 ProcessBuilder 时间再次飙升至一分钟多。

顶部显示没有内存或 CPU 占用。我确实尝试在测试应用程序上执行 jstack,但收到错误“无法创建 thread_db 代理”。

有任何想法吗?

java multithreading solaris processbuilder

5
推荐指数
1
解决办法
2277
查看次数

使用Java ProcessBuilder执行“ echo”不会插入变量(输出字符串“ $ PATH”)

我想回显PATH变量,目标是从Java ProcessBuilder获得与echo $PATH在终端中运行相同的输出。但是,在执行输出时,实际上是输出$PATH而不是PATH变量的值。我想知道ProcessBuilder是否在转义$,并且有防止这种情况的技巧吗?

这是我正在谈论的代码示例,它输出字符串“ $ PATH”:

List<String>  processBuilderCommand = ImmutableList.of("echo","$PATH");

ProcessBuilder processBuilder = new ProcessBuilder(processBuilderCommand).redirectErrorStream(true);

final Process process = processBuilder.start();

String commandOutput = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
                @Override
                public InputStream getInput() throws IOException {
                    return process.getInputStream();
                }
            }, Charset.defaultCharset()));

System.out.println(commandOutput);
Run Code Online (Sandbox Code Playgroud)

一些额外的上下文:

我试图模拟sort我的单元测试之一找不到的命令。我正在使用技巧/技巧来更改我的PATH,并检查结果processBuilder.environment()并确定传递给进程的PATH变量是否足够不允许查找排序(我尝试了空字符串和随机路径)。我想看看shell是否正在做任何有趣的事情并修复我试图破坏的PATH。

java path environment-variables echo processbuilder

5
推荐指数
1
解决办法
2679
查看次数

使用ProcessBuilder运行.java文件

我是Windows XP上Eclipse工作的新手程序员,我需要运行多个进程(这将是一个多计算机系统的模拟).我的初始hackup使用多个线程到多个类,但现在我正在尝试用进程替换线程.

从我的阅读中,我发现ProcessBuilder是最佳选择.我已经尝试了下面看到的许多版本的输入,但是在我的生活中无法弄清楚如何正确使用它.我试图运行我以前创建的.java文件作为类(我已修改).我最终只是制作了一个虚拟的test.java,以确保我的进程正常工作 - 它唯一的功能是打印它运行.

我的两个文件的代码如下.我正确使用ProcessBuilder吗?这是读取子进程输出的正确方法吗?任何帮助将非常感激.

  • 大卫

编辑:解决方案是声明ProcessBuilder("java.exe"," - cp","bin","Broker.test");

主要过程

package Control;
import java.io.*;
import java.lang.*;

public class runSPARmatch {

/**
 * @param args
 */
public static void main(String args[]) {
    try {       
        ProcessBuilder broker = new ProcessBuilder("javac.exe","test.java","src\\Broker\\");
        Process runBroker = broker.start();

        Reader reader = new InputStreamReader(runBroker.getInputStream());
        int ch;
        while((ch = reader.read())!= -1)
            System.out.println((char)ch);
        reader.close();

        runBroker.waitFor();

        System.out.println("Program complete");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated …
Run Code Online (Sandbox Code Playgroud)

java multiprocessing processbuilder

5
推荐指数
1
解决办法
6367
查看次数

通过Java将echo的输出重定向到文件

可能的重复:
ProcessBuilder 重定向输出

下面的代码:

ProcessBuilder pb = new ProcessBuilder(new String[] {"echo", "some text", ">", "test"});
Run Code Online (Sandbox Code Playgroud)

不断返回“ some text > test”。

我究竟做错了什么?

编辑:

这有效

ProcessBuilder pb = new ProcessBuilder(new String[] {"bash", "-c", "echo sometext > test"});
Run Code Online (Sandbox Code Playgroud)

java process io-redirection processbuilder

5
推荐指数
1
解决办法
5851
查看次数

当文件存在时,ProcessBuilder会发出"找不到文件"异常

使用将在Linux Web服务器上运行的应用程序来删除某个目录中的日志,但是我不断收到FileNotFound异常.

这是代码:

public static void deleteLOG() {
    try {
        ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*.log' -delete");
        probuilder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且例外

java.io.IOException: Cannot run program "find . -name '*CoreData*' -delete" (in directory "/home/root/multicraft/servers"): error=2, No such file or directory
        at java.lang.ProcessBuilder.start(Unknown Source)
        at com.mcprohosting.com.nodecleanup.Preprocess.deleteCoreData(Preprocess.java:23)
        at com.mcprohosting.com.nodecleanup.handlers.CleanupHandler.executeCleanup(CleanupHandler.java:36)
        at com.mcprohosting.com.main.NodeCleaner.init(NodeCleaner.java:29)
        at com.mcprohosting.com.main.NodeCleaner.main(NodeCleaner.java:25)
Caused by: java.io.IOException: error=2, No such file or directory
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(Unknown Source)
        at java.lang.ProcessImpl.start(Unknown Source)
        ... 5 more
Run Code Online (Sandbox Code Playgroud)

但是命令cd/home/root/multicraft/servers工作得很好. …

java processbuilder

5
推荐指数
1
解决办法
9970
查看次数

将KeyEvents发送到进程

我正在尝试从我的Java程序向游戏模拟器发送键盘命令,我知道如何设置processprocessbuilder并运行该过程.

但是,我仍然无法从我的发送过程键盘命令Robot.

一个InputStream不会有太大的帮助,因为我需要发送keyEvents,如按"Y"键,并相应地具有模拟器响应.

java process keyevent processbuilder awtrobot

5
推荐指数
1
解决办法
1747
查看次数

ProcessBuilder在多个参数下表现不正常

我有一个ProcessBuilder:

String src = c:/hello/
String dst = c:/hello/2

ProcessBuilder builder = null;
builder = new ProcessBuilder("c:/file/file.exe", "-i", src, "-f", "-l 500", dst);
builder.redirectErrorStream(true);
process = builder.start();
Run Code Online (Sandbox Code Playgroud)

问题是,只要我添加,"-l 500"我得到输出:

"l 500"无效命令

即使我已经输入"-l 500"而不是"l 500".如果我输入"--l 500"我得到:

"-l 500"无效命令

即使-l 500在命令提示符下运行它是一个有效的命令.

如果我删除"-l 500"它再次工作.

我使用Processbuilder错了吗?

编辑:

好吧,如果我将"-l"和"500"作为单独的条目,它似乎有效:

new ProcessBuilder("c:/file/file.exe", "-i", src, "-f", "-l", "500", dst);
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我不能把一个带空格的命令作为同一个条目吗?

java command processbuilder

5
推荐指数
2
解决办法
5538
查看次数

子子进程中CPU负载过高

我正在研究一个使用a运行批处理文件的java程序ProcessBuilder.

public class Test {

    public static void main(String[] args){
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("pathToMyBatch.bat");
            Process process = processBuilder.start();
            StreamReader fluxSortie = new StreamReader(process.getInputStream());
            StreamReader fluxErreur = new StreamReader(process.getErrorStream());
            new Thread(fluxSortie).start();
            new Thread(fluxErreur).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class StreamReader implements Runnable {

        private final InputStream inputStream;

        StreamReader(InputStream inputStream) {
            this.inputStream = inputStream;
        }

        private BufferedReader getBufferedReader(InputStream is) {
            return new BufferedReader(new InputStreamReader(is));
        }

        @Override
        public void run() {
            BufferedReader br = …
Run Code Online (Sandbox Code Playgroud)

java processbuilder

5
推荐指数
1
解决办法
216
查看次数

使用 Java 中的 ProcessBuilder 将进程的输出重定向到另一个进程的输入

我有 processBuilders 定义的两个进程:

ProcessBuilder pb1 = new ProcessBuilder (...)
ProcessBuilder pb2 = new ProcessBuilder (...)
Run Code Online (Sandbox Code Playgroud)

我希望 的输出pb1是 的输入pb2。我在文档中发现我可以pb2通过使用管道从另一个进程读取的输入:

pb2.redirectInput(Redirect.PIPE);
Run Code Online (Sandbox Code Playgroud)

但是,如何指定我希望此管道从 的输出中读取pb1

java pipe io-redirection processbuilder

5
推荐指数
1
解决办法
4801
查看次数