使用 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 时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QProcess 启动 Shell 脚本?

QProcess 没有启动

QProcess 失效且无法重新启动

QProcess:使用输入功能启动 MATLAB 终端会话

从 QThread 启动 QProcess [重复]

QProcess 无法启动进程:未找到进程