【问题标题】:ProcessBuilder and RunTime.exec not running my in codeProcessBuilder 和 RunTime.exec 没有运行我的代码
【发布时间】:2018-12-24 05:37:09
【问题描述】:

我正在用 java 为我的 mongodb 服务器编写一个应用程序,我需要:

1 - 启动我的 Mongo DB 服务器(在终端中是:“mongod”)

2 - 访问 Mongo 并删除一个集合(在终端中执行:“mongo”、“use my_db”和“db.user_coll.drop()”)

3 - 导入新集合(在终端中:“mongoimport --db my_db--collection user_coll --file user_coll”

我可以在终端中完成所有这些,但是当我尝试从 Java 运行时,使用 ProcessBuilder 或 getRunTime.exec(),不工作:(

这是我的代码:

String DBPath ="";

if(args.length<=3) {
 System.out.println("Localizando collection em " + System.getProperty("user.home") + "/Desktop/");
 DBPath = System.getProperty("user.home") + "/Desktop/";
}
else { 
 String LastChar = 
 Character.toString(args[3].charAt(args[3].length()-1));
 if (LastChar == "/") {
  System.out.println("Localizando collection em " + args[3]);
  DBPath = args[3];
 }
 else{
  System.out.println("Localizando collection em " + args[3] + "/");
  DBPath = args[3]+ "/";
 }
}

File f = new File(DBPath + "user_coll");
if(f.isFile()) {
 System.out.println("Collection localizada, iniciando servidor MongoDB e derrubando a collection atual...");
 ProcessBuilder proc = new ProcessBuilder(new String[] {"/bin/bash", "-c", "mongod"});
 proc.start().waitFor();
 String echo = "cd "+ System.getProperty("user.dir")+ " && mongo < mongodbscript.js";
 Process proc2 = new ProcessBuilder(new String[] {"bash","-c", echo}).start();
 System.out.println("Importando nova collection...");
 Process proc3 = new ProcessBuilder(new String[] {"bash", "-c", "cd " + DBPath + " && mongoimport --db my_db --collection user_coll --file user_coll"}).start();
 System.out.println("Collection importada...");
}
else {
 System.out.println("Nova collection não localizada, iniciando servidor MongoDB com a collection existente");
 Process proc = new ProcessBuilder(new String[] {"bash", "-c", "mongod"}).start();
}

【问题讨论】:

  • 请提供minimal reproducible example。仅仅说“它不起作用”通常不足以让我们为您提供帮助。
  • “我可以在终端中完成所有这些” 那么当你在终端中简单地运行mongod 时,终端提示是否真的回来了?还是程序继续运行并在终端打印消息?
  • @Andreas 当我在终端中运行mongod 时,程序继续在后台运行并在终端中打印消息。
  • 当您运行mongod 时,您能否在该终端窗口中运行其他命令?我问的是运行mongod,而不是mongod &amp;。我的猜测不是,这意味着它在前台运行,而不是在后台运行,并阻塞了终端。既然mongod 不会停止,为什么你会期望它在从Java 运行时停止? mongod 甚至可能在输出缓冲区满时停止,因为您从不消耗它的输出。
  • 你好@Andreas,我运行mongod时无法在终端运行其他命令,所以我需要打开其他终端才能运行,例如mongo。通常我运行mongod &amp; mongo(它打开2个终端)。关于mongod 我希望它在后台运行并且不会停止运行(至少在我完成运行代码之前不要停止)。我尝试在没有 mongod 的情况下运行 ProcessBuilder 和 RunTime,例如运行代码:“cd ~/Desktop && mongoimport --db my_db --collection user_coll --file user_coll”但也没有运行。谢谢你帮助我。

标签: java processbuilder runtime.exec


【解决方案1】:

我一直在 MacOS 中解决此问题,并找到了解决方法。

我将mongoimport命令的完整路径添加到exec命令中:

Runtime r  = Runtime.getRuntime();

Process p = r.exec(path + command);

其中路径 = "/Users/'myname'/Documents/mongoInstallation/bin" 和comand =“mongoimport”

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2011-04-29
    • 2016-01-05
    • 2018-06-28
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多