我想知道是否有人确切知道ProcessBuilder/Runtime.exec()是否在JVM内存的空间内执行,或者它是否使用完全独立的系统内存并以某种方式将输出发送到Java.我找不到关于这个主题的任何文件.
我认为它是前者由于安全问题并且能够读取输出,但我想绝对肯定.
是否可以在新进程中执行m.invoke(param1,param2)等语句.
即,我想通过首先使用反射迭代搜索其主类并在查找主类以在新进程中调用它来执行Java类文件.
我想在java代码中调用外部程序,然后Google告诉我Runtime或ProcessBuilder可以帮助我完成这项工作.我已经尝试过了,并且出现了java程序无法退出的问题,这意味着子进程和父进程都会永远等待.他们是悬挂或死锁.
有人告诉我原因是子进程的缓存太小了.当它试图将数据返回给父进程,但是父进程没有及时读取它时,它们都挂起了.所以他们建议我分叉一个线程来负责读取子进程的缓存数据.我这样做就像他们告诉我的那样,但仍有一些问题.
然后我关闭通过方法getOutputStream()获取的输出流.最后,该计划取得了成功.但我不知道为什么会这样?输出流和输入流之间是否存在某种关系?
我试图通过我的FXML应用程序中的ProcessBuilder创建并销毁我创建的外部进程,但它无效.这是基于Sergey Grinev给我的有用建议.
我尝试使用/不使用"// myController.setApp(this);"运行 并使用"// super.stop();" 在子类的顶部和底部(请参阅MyApp中该行的注释/输入),但没有组合可行.
这可能与FXML或JavaFX无关,但我认为这是在JavaFX上开发应用程序的常见模式.我想我要求一个Java最佳实践来关闭基于UI的应用程序中的依赖进程(如本例所示:基于FXML/JavaFX),其中有一个控制器类和一个应用程序类.
你能解释一下我做错了什么吗?或者更好:建议我应该做什么呢?谢谢.
在我的应用程序中我这样做:
public class MyApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader();
Scene scene = (Scene)FXMLLoader.load(getClass().getResource("MyApp.fxml"));
MyAppController myController = (MyAppController)fxmlLoader.getController();
primaryStage.setScene(scene);
primaryStage.show();
// myController.setApp(this);
}
@Override
public void stop() throws Exception {
// super.stop();
// this is called on fx app close, you may call it in an action handler too
if (MyAppController.getScriptProcess() != null) {
MyAppController.getScriptProcess().destroy();
}
super.stop(); …Run Code Online (Sandbox Code Playgroud) 我需要一种Java方法来查找正在运行的操作系统进程,我知道该进程的名称和可执行文件的路径.我想看看它现在是否正在运行,如果我发现它,我需要一种方法来终止这个过程.
我的问题类似于如何从java中查找并杀死 - 运行 - 获胜 - 进程 -但不限于Windows.
我是否被迫每个平台执行一次实现,或者是否有一些技巧/库/ api我不知道可以做到这一点?
我有以下代码:
private void GetInfo(String src) throws IOException{
Scanner scan = new Scanner(System.in);
String filename = new File(src).getName();
ProcessBuilder builder = new ProcessBuilder("/Users/Daim/Desktop/process", src);
builder.redirectErrorStream(true);
Process process = builder.start();
final InputStream is = process.getInputStream();
new Thread(new Runnable() {
String line;
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Pattern p = Pattern.compile("least");
Matcher m = p.matcher(line);
//System.out.println("match");
}
}).start();
} …Run Code Online (Sandbox Code Playgroud) 在linux(debian)上,我可以运行这个命令:
/usr/lib/jvm/jdk1.7.0_21/bin/java -jar ~/myjar.jar ".*"
Run Code Online (Sandbox Code Playgroud)
我试图从Java程序运行它,而不是:
ProcessBuilder pb = new ProcessBuilder(java, "-jar", "~/myjar.jar", "\".*\"");
Run Code Online (Sandbox Code Playgroud)
System.out.println(pb.command()); 按预期打印以下内容:
[/usr/lib/jvm/jdk1.7.0_21/bin/java, -jar, ~/myjar.jar, ".*"]
Run Code Online (Sandbox Code Playgroud)
但是我从程序中得不到相同的输出(它运行但输出看起来好像".*"没有正确考虑参数).
任何想法为什么它不起作用?
注意:相同的代码在Windows上运行正常.
我知道如何在线查找答案,用Java中的参数打开一个exe程序.但是我的具体捷径对我来说有点复杂.
我正在尝试打开一个具有以下目标的快捷方式:
C:\Windows\System32\javaw.exe -cp jts.jar;total.2012.jar -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true -Xmx768M -XX:MaxPermSize=128M jclient/LoginFrame C:\Jts
在我的程序中,我将分割位置和我认为的参数分开.但是,当我运行程序时,我收到错误'Could not create Java Virtual Machine, Program will Exit'.能够更好地了解最新情况的人能解释我可能做错了什么,或者指出我可以阅读的方向吗?
String location = "C:\\Windows\\System32\\javaw.exe";
String p1="-cp jts.jar;total.2012.jar";
String p2="-Dsun.java2d.noddraw=true";
String p3="-Dswing.boldMetal=false";
String p4="-Dsun.locale.formatasdefault=true";
String p5="-Xmx768M";
String p6="-XX:MaxPermSize=128M";
String p7="jclient/LoginFrame" ;
String p8 = "C:\\Jts";
try {
Process p = new ProcessBuilder(location,p1,p2,p3,p4,p5,p6,p7,p8).start();
} catch (IOException ex) {
Logger.getLogger(Openprogramtest.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ProcessBuilder运行"java -version":
processBuilder = new ProcessBuilder("java -version");
process = processBuilder.start();
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
java.io.IOException: Cannot run program "java -version": CreateProcess error=2, The system cannot find the file specified
Run Code Online (Sandbox Code Playgroud)
当我删除"-version"并执行:
processBuilder = new ProcessBuilder("java");
process = processBuilder.start();
Run Code Online (Sandbox Code Playgroud)
它运行正常,我得到正常的帮助指南输出.
我怎样才能让它运行参数呢?
从一台Linux机器上,我想在远程Linux机器上运行命令,如下所示:
ssh remote_user @ remote_server remote_command <local_script
这里remote_command是在远程计算机上运行的命令,local_script是本地计算机上的一个文件,其中包含要传递给remote_command的字符串.如果我在本地计算机上的命令行运行它,那么我可以验证该命令在远程计算机上具有正确的效果.但是,我需要使用ProcessBuilder在Java应用程序中运行它,如下所示:
processBuilder = new ProcessBuilder("ssh remote_user@remote_server remote_command < local_script");
processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
process = processBuilder.start();
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我总是得到错误:
zsh:1:没有这样的文件或目录:local_script
我尝试过各种变体,例如:
processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server remote_command < local_script");
processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server", "remote_command < local_script");
processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server", "remote_command", "<", " local_script");
Run Code Online (Sandbox Code Playgroud)
但似乎没什么用.我已经验证运行pwd给出了预期的目录,并且在使用ProcessBuilder运行时可以读取local_script(使用cat),所以我必须假设它与ssh命令的处理方式有关.有任何想法吗?
processbuilder ×10
java ×9
arguments ×1
fxml ×1
javafx-2 ×1
kill ×1
linux ×1
memory ×1
outputstream ×1
reflection ×1
runtime.exec ×1
ssh ×1