Системната команда се изпълнява, но незабавно се поставя на заден план

Опитвам се да използвам модула TProcess, за да изпълня ssh, за да се свържа с един от моите сървъри и да ми предостави обвивката. Това е пренаписване на едно, което имах в Ruby, тъй като времето за изпълнение за Ruby е много бавно. Когато стартирам функцията си Process.Execute, ми се представя обвивката, но тя веднага е на заден план. Изпълнението на 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;

TempFile е променлива от тип TProfile, която е запис, съдържащ информация за сървъра. Системата за каталогизиране и извличане работи добре, но издърпването на обвивката не работи.


person Mark    schedule 03.09.2015    source източник
comment
още ли имаш нужда от отговор?   -  person Jorge Aldo    schedule 19.09.2015


Отговори (1)


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

Започвате процеса, но не чакате да излезе. Това е от документацията на Execute:

Execute всъщност изпълнява програмата, както е посочено в CommandLine, като прилага колкото се може повече от посочените опции, поддържани на текущата платформа.

Ако опцията poWaitOnExit е посочена в Опции, тогава повикването ще се върне само когато програмата приключи изпълнението (или ако възникне грешка). Ако тази опция не е дадена, обаждането се връща незабавно[sic], но извикването WaitOnExit може да се използва, за да изчака затварянето му, или извикването Running може да се използва, за да се провери дали все още се изпълнява .

Трябва да зададете опцията poWaitOnExit в опциите, преди да извикате Execute, така че Execute да блокира, докато процесът излезе. Или извикайте AProcess.WaitOnExit, за да изчакате изрично процеса да излезе.

person Kenster    schedule 03.09.2015
comment
Задаването на което и да е от тези води до това моят вход да бъде скрит и всички следващи редове на изход на дистанционното управление да добавят три символа за табулация в началото на реда. Много ми е трудно да разбера защо, някакви идеи? - person Mark; 03.09.2015
comment
Ако имате нов въпрос, трябва да зададете нов въпрос. И включете целия си подходящ изходен код в текущата му форма. - person Kenster; 03.09.2015
comment
Правилната опция е poUsePipes, за да позволи на процеса да комуникира с родителя чрез потоците, които tprocess предоставя. трябва да настроите съответно тръбния буфер чрез pipebuffersize. трябва да използвате изпълнение, а не waitforexit. работите асинхронно, а не синхронно. по същество този отговор е грешен и аз ще напиша моя по-късно. - person Jorge Aldo; 19.09.2015