猿问

ProcessBuilder 不在服务器上创建文件

我正在使用进程生成器从 postgres 运行psql命令来调用copy命令来导出一些表。


我的工作流程如下:


String sql = "\"\\copy ( SELECT * from table ) TO '/folder' DELIMITER '|' NULL '\\N'\";


List<String> commands = new ArrayList<>();

commands.add("sudo");

commands.add("-u");

commands.add("root");

commands.add("psql");

commands.add("-h");

commands.add("host");

commands.add("-U");

commands.add("postgres");

commands.add("-d");

commands.add("database");

commands.add("-c");

commands.add(sql);


ProcessBuilder process = new ProcessBuilder(commands);


Process execution = process.start();

execution.waitFor(); // each calling to export data wait a little to generate next;

以下命令将在该命令中打开 Final:


sudo -u root psql -h host -U postgres -d database_user -c \copy ( select * from table TO "/folder/file.txt/" DELIMITER '|' NULL '\\N'" )

但它file.txt不是在服务器中创建的,即使作为root.


本地工作正常。但是当在服务器内运行时,命令不会运行。问题出在哪里?


万千封印
浏览 107回答 1
1回答

智慧大石

我已经解决了这个问题。只需删除“-c”参数的引号,即不转义最终字符串。反而:sudo&nbsp;-u&nbsp;root&nbsp;psql&nbsp;-h&nbsp;host&nbsp;-U&nbsp;postgres&nbsp;-d&nbsp;database_user&nbsp;-c&nbsp;\copy&nbsp;"(&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;TO&nbsp;'/folder/file.txt/')&nbsp;DELIMITER&nbsp;'|'&nbsp;NULL&nbsp;'\\N'我用了:sudo&nbsp;-u&nbsp;root&nbsp;psql&nbsp;-h&nbsp;host&nbsp;-U&nbsp;postgres&nbsp;-d&nbsp;database_user&nbsp;-c&nbsp;\copy&nbsp;(&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;TO&nbsp;'/folder/file.txt/')&nbsp;DELIMITER&nbsp;'|'&nbsp;NULL&nbsp;'\\N'
随时随地看视频慕课网APP

相关分类

Java
我要回答