使用 QProcess 启动 pg_dumpall 时不起作用
Posted
技术标签:
【中文标题】使用 QProcess 启动 pg_dumpall 时不起作用【英文标题】:pg_dumpall not working when start it with QProcess 【发布时间】:2016-06-17 12:57:01 【问题描述】:我想将我的数据和表从一个 postgres 安装复制到另一个,源版本在端口 5432 上侦听目标服务器的端口 5433。用户 myUser 在两个版本上都是超级用户。
使用 QProcess 启动 Postgres "pg_dumpall" 时不起作用 但该命令在 windows cmd 中有效,这里是:
pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433
但不是来自使用 QProcess 的 Qt 代码:
QProcess *startProgram = new QProcess();
startProgram->start("pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433");
startProgram->waitForFinished()
return true
startProgram->exitCode();
returns 1
startProgram->exitStatus();
return 0
无论如何,我的数据和表格都没有复制到目的地。 使用 QProcess 创建数据库可以使用:
startProgram->start("createdb -p 5433 -U myUser myDbName");
【问题讨论】:
我猜QProcess
只能启动可执行文件或脚本。您在命令中有一个管道,必须将其解释为 shell,并最终启动两个进程。 system
可能适用于此。或者您启动 cmd.exe
并将命令作为参数传递 (IIRC /c
)。
【参考方案1】:
是的,它有点烦人,我试图用 ls | grep <pattern>
类型命令做同样的事情 - 这会产生多个进程......
我为 linux 想出了这个:
if (QProcess::startDetached("xfce4-terminal -x bash -c \"ls -l | grep main > out\""))
qDebug("ok\n");
else
qDebug("failed\n");
所以基本上如果我把它分解:
QProcess 使用执行参数 -x 运行 xfce4-terminal(或您想要的任何术语):
xfce4-terminal -x <command to execute>
然后使用命令参数 -c(在转义引号中)执行 bash:
bash -c \"bash command\"
最后是 bash 命令:
ls -l | grep main > out
因此,对于您的应用程序,您可以将最终命令(第 3 部分)替换为:
pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433
我假设您使用的是 linux? (对于使用cmd
而不是终端的windows,也有类似的可能性。您也可以将xfce4-terminal
替换为gnome-terminal
,这可能更常见,但可能需要检查-x 是否相同... . IIRC 是。
可能有更好的方法来做到这一点....但我想利用 bash 的力量,所以这似乎是合乎逻辑的方法。
进一步:我认为你可以这样做:
QProcess::startDetached("bash -c \"ls -l | grep main > out\"")
并摆脱终端部分,(适用于像 ls 这样的简单东西),但我不确定所有路径和其他东西是否都已设置...值得一试,因为它更整洁并删除了你的依赖任何特定的终端...
【讨论】:
【参考方案2】:谢谢!是的,管道是问题所在。
在 Windows 中这对我有用:
QProcess *startProgram = new QProcess();
startProgram->start("cmd /c \"pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433\"");
【讨论】:
以上是关于使用 QProcess 启动 pg_dumpall 时不起作用的主要内容,如果未能解决你的问题,请参考以下文章