我正在尝试从java程序运行Python,Ruby,C,C++和Java脚本,并且向我建议使用Processbuilder作为运行脚本的好方法.根据我的理解,Processbuilder主要运行本机文件(Windows上的.exe等).但是,我听说过使用Processbuilder运行脚本(非本地)文件的一些事情.不幸的是,我在这个主题上发现的一切都非常模糊.
如果有人可以澄清一种运行非本地脚本的方法,比如Python,Ruby等,我将非常感激!
我的问题是,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 代理”。
有任何想法吗?
我想回显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。
我是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) 可能的重复:
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) 使用将在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程序向游戏模拟器发送键盘命令,我知道如何设置process从processbuilder并运行该过程.
但是,我仍然无法从我的发送过程键盘命令Robot.
一个InputStream不会有太大的帮助,因为我需要发送keyEvents,如按"Y"键,并相应地具有模拟器响应.
我有一个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)
为什么会这样?我不能把一个带空格的命令作为同一个条目吗?
我正在研究一个使用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) 我有 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?