2015-09-03 2 views
1

Je tente d'utiliser l'unité TProcess pour exécuter ssh afin de me connecter à l'un de mes serveurs et de me fournir le shell. C'est une réécriture de celle que j'avais dans Ruby car le temps d'exécution de Ruby est très lent. Quand je lance ma fonction Process.Execute, je suis présenté avec le shell mais il est immédiatement décoré. Running pgrep ssh révèle qu'il est en cours d'exécution, mais je n'ai aucun accès à ce que ce soit, en utilisant fg ne le ramène pas. Le code est le suivant pour ce segment:La commande système s'exécute mais est immédiatement mise en arrière-plan

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 est une variable de type TProfile, qui est un document contenant des renseignements concernant le serveur. Le système de catalogage et de récupération fonctionne bien, mais en tirant la coque ne fonctionne pas.

+0

avez-vous encore besoin d'une réponse? –

Répondre

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

Vous démarrez le processus sans attendre sa sortie. Ceci est de the documentation on Execute:

Exécuter exécute en fait le programme tel que spécifié dans LigneCommande, en appliquant autant que des options spécifiées en appui sur la plate-forme actuelle.

Si l'option poWaitOnExit est spécifiée dans Options, l'appel ne sera renvoyé qu'une fois l'exécution du programme terminée (ou si une erreur s'est produite). Si cette option n'est pas donnée, l'appel renvoie immédiatement [sic], mais l'appel WaitOnExit peut être utilisé pour attendre sa fermeture ou l'appel en cours peut être utilisé pour vérifier s'il est toujours en cours d'exécution.

Vous devez définir l'option poWaitOnExit dans les options avant d'appeler Execute, de sorte que Execute bloquera jusqu'à ce que le processus se termine. Ou appelez AProcess.WaitOnExit pour attendre explicitement que le processus se termine.

+0

La définition de l'une ou l'autre de ces entrées permet de masquer l'entrée et toutes les lignes de sortie suivantes sur la télécommande pour ajouter trois caractères de tabulation au début de la ligne. J'ai vraiment du mal à comprendre pourquoi, des idées? – Mark

+0

Si vous avez une nouvelle question, vous devriez poser une nouvelle question. Et incluez tout votre code source pertinent dans son formulaire actuel. – Kenster

+0

L'option correcte est poUsePipes pour permettre au processus de communiquer avec le parent via les flux fournis par tprocess. vous devez définir le tampon de canal en conséquence via pipebuffersize. vous devriez utiliser execute not waitforexit. vous exécutez assynchronous, pas de manière synchrone. Essentiellement, cette réponse est fausse et j'écrirai la mienne plus tard. –