【问题标题】:qt run shell commands via qprocessqt 通过 qprocess 运行 shell 命令
【发布时间】:2017-03-17 09:15:17
【问题描述】:

我正在开发一个小型 QT 应用程序来与终端交互,向终端发送命令并读取打印出来的信息。

示例:使用ps -aux获取所有进程的输出

问题

我可以将信息写入终端,但我认为它不在系统范围内,实际示例:

命令传递给 shell 解释器"echo "pre"; ps -aux; echo "post"

从评论中编辑:

我需要发送特定的完整命令,我不是在寻找缩短或替代的命令,我需要一种发送这样的命令的方法:ps -aux | grep chrome | tr -s " " | cut -d " " -f 2 并读取其输出。这个例子正在获取所有正在运行的 chrome 进程的所有 pid

尝试翻译

  • sh
  • /bin/bash

代码:

QProcess *proc_ovpn = new QProcess(this);
proc_ovpn->waitForFinished();
proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");
proc_ovpn->setProcessChannelMode(QProcess::MergedChannels);
QString str(proc_ovpn->readAllStandardOutput());
return str;                             <<< ======= //breakpoint here

调试信息:

到达断点时,调试信息如下:

Locals      
    str ""  QString
    this    @0x555555ad7be0 Interface
Inspector       
Expressions     
Return Value        
Tooltip     
    10000000    10000000    int

在SO上的帖子中建议使用上述方法运行shell代码,但找不到了。

我很茫然,我不明白为什么运行这些命令不能直接与系统(及其信息)交互,

有什么建议吗?

【问题讨论】:

  • 您需要ps -aux 的外壳吗?为什么不直接使用ps 作为命令并使用-aux 作为参数?
  • @KevinKrammer 我需要发送完整的shell命令并读取输出,如上所述,另一个例子是ps -aux | grep chrome | tr -s " " | cut -d " " -f 2,这将检索所有chrome进程的所有pid。我需要像我提到的那样发送命令并检索它的输出。
  • 调用ps 命令然后读取并处理其输出不是更简单吗?
  • @KevinKrammer 您似乎坚持使用特定命令的替代方案。我需要向 shell 发送任何命令并读取响应。我将如何处理这个然后ifconfig | grep tun0 &gt; /dev/null;r=$?;echo $r。这和前面的完全一样。你现在明白了吗?
  • “任何命令”就像用户输入的那样?那为什么用户不只是使用终端呢?

标签: c++ linux bash qt shell


【解决方案1】:

你需要在start之后使用waitForFinished(),而不是之前

proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");
proc_ovpn->waitForFinished();

请注意,waitForFinished() 会阻塞,直到进程(由start 调用)完成...

另外,您可以检查进程是否成功启动和/或waitForFinished 是否超时

proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");

if(!proc_ovpn->waitForStarted()) //default wait time 30 sec
    qWarning() << " cannot start process ";

int waitTime = 60000 ; //60 sec
if (!proc_ovpn->waitForFinished(waitTime))
         qWarning() << "timeout .. ";

【讨论】:

  • 快速阅读waitForFinished(),之前有它是有意义的,为什么它需要在之后?
  • @KGCybeX 欢迎您! .. 实际上 1-开始 2-等待开始 3-等待完成 ..