【发布时间】: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 &。我的猜测不是,这意味着它在前台运行,而不是在后台运行,并阻塞了终端。既然mongod不会停止,为什么你会期望它在从Java 运行时停止?mongod甚至可能在输出缓冲区满时停止,因为您从不消耗它的输出。 -
你好@Andreas,我运行
mongod时无法在终端运行其他命令,所以我需要打开其他终端才能运行,例如mongo。通常我运行mongod & mongo(它打开2个终端)。关于mongod我希望它在后台运行并且不会停止运行(至少在我完成运行代码之前不要停止)。我尝试在没有mongod的情况下运行 ProcessBuilder 和 RunTime,例如运行代码:“cd ~/Desktop && mongoimport --db my_db --collection user_coll --file user_coll”但也没有运行。谢谢你帮助我。
标签: java processbuilder runtime.exec