系统命令执行但立即后台运行

时间:2015-09-03 02:34:00

标签: ssh pascal lazarus freepascal delphi

我正在尝试使用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类型的变量,它是包含有关服务器信息的记录。编目系统和检索工作正常,但拔出shell并没有。

1 个答案:

答案 0 :(得分:1)

...
AProcess.ShowWindow:= swoShow;
AProcess.InheritHandles:= False;
AProcess.Execute;
AProcess.Free;
...

您正在启动该流程但不等待它退出。这来自the documentation on Execute

  

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

     

如果在Options中指定了poWaitOnExit选项,则只有在程序执行完毕后(或发生错误时)才会返回调用。 如果未给出此选项,则呼叫立即返回 [sic],但可以使用WaitOnExit呼叫等待它关闭,或者可以使用Running呼叫来检查它是否仍在运行

您应该在调用poWaitOnExit之前在选项中设置Execute选项,以便执行将阻止,直到进程退出。或者调用AProcess.WaitOnExit来明确等待进程退出。