Problème avec sous-processus
blux
Messages postés
27127
Date d'inscription
Statut
Modérateur
Dernière intervention
-
blux Messages postés 27127 Date d'inscription Statut Modérateur Dernière intervention -
blux Messages postés 27127 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
je souhaite exécuter des commandes sur un linux via perl mais en conservant un état entre deux commandes. Je m'explique.
J'ai une commande qui s'exécute en ligne comme toute commande standard via bash.
Si je veux la scripter en shell, je suis obligé de la faire précéder de source afin qu'elle ne m'engueule pas (sinon :return: can only `return' from a function or sourced script).
Ca marche bien dans un fichier exécuté via le shell.
Cette commande initialise un environnement, je peux donc, toujours dans un script shell, lancer une autre commande qui s'appuie sur le résultat de la première.
Je cherche à faire la même chose en perl, pour pouvoir récupérer les infos en retour, les analyser et continuer en fonction des résultats.
Je n'arrive pas à lancer ma commande de manière simple avec les backquotes (tenté un /bash/bin source commande) et quand elle s'exécute, elle part dans un shell fils qui se termine dès que la commande est finie.
Y-a-t-il un moyen (simple) ? A part tout écrire en shell ?
Merci d'avance aux bonnes âmes...
A+ blux
je souhaite exécuter des commandes sur un linux via perl mais en conservant un état entre deux commandes. Je m'explique.
J'ai une commande qui s'exécute en ligne comme toute commande standard via bash.
Si je veux la scripter en shell, je suis obligé de la faire précéder de source afin qu'elle ne m'engueule pas (sinon :return: can only `return' from a function or sourced script).
Ca marche bien dans un fichier exécuté via le shell.
Cette commande initialise un environnement, je peux donc, toujours dans un script shell, lancer une autre commande qui s'appuie sur le résultat de la première.
Je cherche à faire la même chose en perl, pour pouvoir récupérer les infos en retour, les analyser et continuer en fonction des résultats.
Je n'arrive pas à lancer ma commande de manière simple avec les backquotes (tenté un /bash/bin source commande) et quand elle s'exécute, elle part dans un shell fils qui se termine dès que la commande est finie.
Y-a-t-il un moyen (simple) ? A part tout écrire en shell ?
Merci d'avance aux bonnes âmes...
A+ blux
"Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
A voir également:
- Problème avec sous-processus
- Processus vmmem ✓ - Forum Virus
- Echec de l'initialisation du processus de connexion interactive - Forum Windows 7
- Processus d'execution client serveur - Forum Windows 10
- Processus hote windows rundll32 - Forum Virus
- Quest ce que Processus hôte windows(Rundll32) ✓ - Forum Logiciels
1 réponse
Salut blux :-)
Je ne suis pas sûr de bien saisir ton problème, mais si ce que tu veux c'est importer les changements de variables d'environnement dans ton environnement d'exécution Perl (dans %ENV), ce module CPAN est conçu pour cela :
Shell::EnvImporter
Outre des scripts ou commandes, il permet même de mettre en entrée des fichiers de configuration utilisés par le shell (par exemple .bashrc).
Dal
Je ne suis pas sûr de bien saisir ton problème, mais si ce que tu veux c'est importer les changements de variables d'environnement dans ton environnement d'exécution Perl (dans %ENV), ce module CPAN est conçu pour cela :
Shell::EnvImporter
Outre des scripts ou commandes, il permet même de mettre en entrée des fichiers de configuration utilisés par le shell (par exemple .bashrc).
Dal
Je ne suis pas sûr de bien saisir ton problème
C'est normal.
Je t'explique le contexte :
je dispose d'une machine Linux sur laquelle est déployée une appliance nommée vMA, il s'agit d'une appliance destinée à gérer à distance des machines virtuelles VMware
Ces machines virtuelles (nommées VM) sont installées sur des serveurs physiques (nommés ESXi) mais elles déplaçables dynamiquement/automatiquement de l'un à l'autre de ces ESXi en fonction de leur charge (ou d'autres paramètres).
Le tout est géré via une VM sur laquelle est installée une appliance nommée vCenter (qui elle, sait tout à un instant donné de l'architecture en route : quelle VM est en exécution, sur quelle machine physique...
Mon appliance vMA doit donc dialoguer avec soit une machine physique, soit le vCenter.
Il est livré dans cette vMA plein de binaires qui sont destinés à établir le dialogue entre vMA et les ESXi ou vCenter. Notamment, une couche qui permet de saisir des 'credentials' avec user/mot de passe afin que des scripts utilisateurs ne soient pas obligés de les faire figurer en dur dans le code.
Là où on arrive à ce que je souhaite, c'est qu'avant d'aller donner un ordre à un ESXi/vCenter pour lui dire d'effectuer une opération sur une VM, je dois le positionner comme mon 'défaut' pour la session en cours (car je pourrais m'adresser à l'un ou l'autre des ESXi/vCenter). Ce positionnement se fait grâce à une commande livrée (nommée vifptarget). Je peux ensuite passer un script perl qui va s'adresser à la machine 'défaut' pour effectuer son action sur la VM.
Mon problème se situe à deux niveaux :
- la commande de positionnement de la machine 'défaut' n'est pas scriptable en l'état (via un shell, je suis obligé de la préfixer avec source sinon j'ai ma petite erreur, je peux sans doute l'intercepter en retour perl et la traiter comme il se doit). Ce n'est pas à proprement parler un problème mais ça m'ennuie.
- une fois que j'ai lancé cette commande via perl (avec backquote) et que je retourne dans mon perl pour exécuter ma commande d'action sur une VM, je n'ai plus mon 'défaut' positionné puisqu'il s'est déroulé dans un contexte différent (PID fils) et donc je ne peux rien faire
Et quand je pense que ma vMA est destinée à être accédée via SSH depuis un AIX, ça ne me rassure pas ;-)
C'est plus clair ?
J'ai juste pas envie de tout écrire en shell car je trouve perl bien mieux pour ce que j'ai à faire (log des actions, mise en page...)
As tu regardé sa doc sur CPAN ?
De plus, je ne veux pas les récupérer, je ne sais même pas comment elles sont positionnées par la commande vifptarget.
il semble que cela soit donc un script shell, qui par le biais de "source" est sourcé par le même shell où il est lancé.
dans ces conditions, il y a des chances que cela fonctionne de la même façon que ceci :
L'environnement créé par le script sourcé est bien importé dans celui propre au processus Perl, et il dure le temps que durera ce processus.
à la place de tu mets dans le constructeur, et cela devrait importer les variables d'environnement.
Selon la doc, ce Module Perl fait cela :
- en créant une sauvegarde de l'environnement,
- en créant un script shell qui source le script à sourcer (ou qui exécute la commande à exécuter)
- en exécutant le script (dans un process disctinct, forcément)
- en parsant le résultat du script pour récupérer les changements effectués à l'environnement
- en important ces changements dans le processus dans lequel Perl fonctionne
Dal
Je suis donc passé par un bout de shell qui appelle le perl, comme ça, perl bénéficie des variables et autres joyeusetés (chargement de librairies...) positionnées par son appelant ;-)
Merci quand même de t'être penché sur ce problème disons, spécifique...