ProcessBuilder 在 java 中执行 shell 命令,但似乎没有任何效果
Execute shell commands by ProcessBuilder In java but seems nothing work
我想将选定的数据库导出到容器中。当使用 shells 命令时,我使用这个
kubectl exec -it pg-container -n data-prod -- /bin/bash -c "pg_dump -U nsc -d nsc -n public -f nsc.sql"
当 data-prod 是命名空间并且 pg-container 是具有 PostgreSQL 数据库的容器时。
此命令在 shell 中运行良好。但是我想使用 ProcessBuilder 在 Java 中执行此命令。
java中的实现是这样的:
public class ExportDBInfo {
String dbname;
String schemaname;
ArrayList<String> tablesname;
String dbuser;
String output;
}
for (ExportDBInfo dbinfo : Array_db_info){
String export_database_cmd = String.format("kubectl exec -it pg-container -n data-prod -- /bin/bash -c \"pg_dump -U %s -d %s -n %s %s -f %s.sql\"",dbinfo.dbuser,dbinfo.dbname,dbinfo.schemaname,query_tables,dbinfo.output);
ProcessBuilder pb = new ProcessBuilder(export_database_cmd);
pb.start().waitFor();
}
但这不起作用。我想知道我的实现是否有一些错误。
非常感谢!
Java 不是 bash 或 shell。您真的不想使用 exec
,它的规则有些奇怪。它非常随意地尝试按空格拆分。
而是使用 ProcessBuilder
,并指定一个 列表 参数,而不是单个字符串变体。
整个 pg_dump 是一个 单个参数 并且应该 不 包含引号 - 这些引号是 'eaten' 通过 bash 并告诉 bash 将其全部视为一个参数; java 不是 bash,只是盲目地将它们传递给 kubectl 工具,它不知道它是什么意思。
所有其他参数(包括--
)都是他们自己的东西。
所以..
List.of("/bin/kubectl", "exec", "-it", "pg-container", "-n", "data-prod", "--", "/bin/bash", "-c", String.format("pg_dump -U %s -d %s -n %s %s -f %s.sql", dbinfo.dbuser, dbinfo.dbname, dbinfo.schemaname, query_tables, dbinfo.output));
并将其传递给 ProcessBuilder
的构造函数。
我想将选定的数据库导出到容器中。当使用 shells 命令时,我使用这个
kubectl exec -it pg-container -n data-prod -- /bin/bash -c "pg_dump -U nsc -d nsc -n public -f nsc.sql"
当 data-prod 是命名空间并且 pg-container 是具有 PostgreSQL 数据库的容器时。
此命令在 shell 中运行良好。但是我想使用 ProcessBuilder 在 Java 中执行此命令。
java中的实现是这样的:
public class ExportDBInfo {
String dbname;
String schemaname;
ArrayList<String> tablesname;
String dbuser;
String output;
}
for (ExportDBInfo dbinfo : Array_db_info){
String export_database_cmd = String.format("kubectl exec -it pg-container -n data-prod -- /bin/bash -c \"pg_dump -U %s -d %s -n %s %s -f %s.sql\"",dbinfo.dbuser,dbinfo.dbname,dbinfo.schemaname,query_tables,dbinfo.output);
ProcessBuilder pb = new ProcessBuilder(export_database_cmd);
pb.start().waitFor();
}
但这不起作用。我想知道我的实现是否有一些错误。 非常感谢!
Java 不是 bash 或 shell。您真的不想使用 exec
,它的规则有些奇怪。它非常随意地尝试按空格拆分。
而是使用 ProcessBuilder
,并指定一个 列表 参数,而不是单个字符串变体。
整个 pg_dump 是一个 单个参数 并且应该 不 包含引号 - 这些引号是 'eaten' 通过 bash 并告诉 bash 将其全部视为一个参数; java 不是 bash,只是盲目地将它们传递给 kubectl 工具,它不知道它是什么意思。
所有其他参数(包括--
)都是他们自己的东西。
所以..
List.of("/bin/kubectl", "exec", "-it", "pg-container", "-n", "data-prod", "--", "/bin/bash", "-c", String.format("pg_dump -U %s -d %s -n %s %s -f %s.sql", dbinfo.dbuser, dbinfo.dbname, dbinfo.schemaname, query_tables, dbinfo.output));
并将其传递给 ProcessBuilder
的构造函数。