【问题标题】:System command executes but is immediately backgrounded系统命令执行但立即在后台运行
【发布时间】:2015-09-03 02:33:59
【问题描述】:

我正在尝试使用 TProcess 单元执行 ssh 以连接到我的一台服务器并为我提供 shell。这是对我在 Ruby 中的一个重写,因为 Ruby 的执行时间非常慢。当我运行我的 Process.Execute 函数时,我看到了 shell,但它立即成为背景。运行pgrep ssh 表明它正在运行,但我无权访问它,使用fg 不会将其恢复。该段代码如下:

  if HasOption('c', 'connect') then begin
    TempFile:= GetRecord(GetOptionValue('c', 'connect'));
    AProcess:= TProcess.Create(nil);
    AProcess.Executable:= '/usr/bin/ssh';
    AProcess.Parameters.Add('-p');
    AProcess.Parameters.Add(TempFile.Port);
    AProcess.Parameters.Add('-ntt');
    AProcess.Parameters.Add(TempFile.Username + '@' + TempFile.Address);
    AProcess.Options:= [];
    AProcess.ShowWindow:= swoShow;
    AProcess.InheritHandles:= False;
    AProcess.Execute;
    AProcess.Free;
    Terminate;
    Exit;
  end;

TempFileTProfile 类型的变量,它是包含有关服务器信息的记录。编目系统和检索工作正常,但拉起外壳却不行。

【问题讨论】:

  • 你还需要答案吗?

标签: ssh pascal lazarus freepascal delphi


【解决方案1】:
...
AProcess.ShowWindow:= swoShow;
AProcess.InheritHandles:= False;
AProcess.Execute;
AProcess.Free;
...

您正在启动该过程,但没有等待它退出。这是来自the documentation on Execute

Execute 实际执行 CommandLine 中指定的程序,应用当前平台支持的尽可能多的指定选项。

如果在 Options 中指定了 poWaitOnExit 选项,那么只有在程序完成执行(或发生错误)时调用才会返回。 如果没有给出这个选项,调用会立即返回[sic],但是可以使用 WaitOnExit 调用等待它关闭,或者可以使用 Running 调用来检查它是否还在运行.

您应该在调用Execute 之前在选项中设置poWaitOnExit 选项,这样Execute 就会阻塞,直到进程退出。或者调用AProcess.WaitOnExit 显式等待进程退出。

【讨论】:

  • 设置其中任何一个都会导致我的输入被隐藏,并且遥控器上的所有后续输出行都会在行首添加三个制表符。我很难弄清楚为什么,有什么想法吗?
  • 如果你有一个新问题,你应该问一个新问题。并以当前形式包含所有相关的源代码。
  • 正确的选项是 poUsePipes 以允许进程通过 tprocess 提供的流与父进程通信。您必须通过 pipebuffersize 相应地设置管道缓冲区。你应该使用执行而不是等待退出。您正在异步运行,而不是同步运行。基本上这个答案是错误的,我稍后再写。
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2013-02-13
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多