Faire dépendre un processus d'un autre

Faire dépendre un processus d'un autre - VB/VBA/VBS - Programmation

Marsh Posté le 09-08-2007 à 17:00:20    

Bonjour.
Je cherche à faire dépendre l'exécution de 3 exécutables windows (.exe) de la présence d'un 4e exécutable.
L'ordre de lancement importe peu mais il faudrait que si le dernier .exe est fermé tous les autres .exe le soient.
 
En gros pour faire une analogie shell Unix j'aurai besoin d'un truc du genre :
 
#!/bin/bash
process1.exe &
process2.exe &
process3.exe &
process4.exe
exit
 
Est ce que quelqun sait faire ca au travers d'un .VBS ou d'un .CMD / .BAT ?
 
Merci beaucoup :)

Reply

Marsh Posté le 09-08-2007 à 17:00:20   

Reply

Marsh Posté le 10-08-2007 à 12:27:58    

salut, dans ton raisonnement, tu cherches juste à tester l'ouverture de process ? ou bien est-ce plus perfide que ca ? :p

Reply

Marsh Posté le 10-08-2007 à 14:59:41    

Non le process4 a besoin des 3 autres (qu'ils soient lancés avant ou après importe peu) mais je ne veux pas que les 3 premiers process continuent à tourner après la fermeture du process4 .
 
Comme il s'agit d'applications qui tourneront sous Citrix il y aura de nombreux process de ce type lancés par différents utilisateurs, je ne peux donc pas faire un kill des 3 process en fonction de leur nom sous peine de shooter des process appartenant à quelqun d'autre.

Reply

Marsh Posté le 10-08-2007 à 16:27:45    

et ces 3 process, c toi qui les lance non ? tu passes pas par un x = shell() ? tu kill just le x... non ?

Reply

Marsh Posté le 13-08-2007 à 08:33:42    

Il faudrait que tous les process soient lancés par un .bat.
Mon soucis c'est que je ne sais pas attacher des process à un cmd.exe tout en rendant la main au cmd.exe pour lancer un autre process.
 
C'est par contre très facilement faisable sous bash (comme le montre l'exemple que j'ai donné plus haut et qui fait exactement ce que je veux) en utilisant un "&" à la fin de la commande : le process lancé est rattaché au bash mais rend la main, et en cas de fermeture du bash les process sont arretés.

Reply

Marsh Posté le 15-08-2007 à 08:01:46    

Une idée ?

Reply

Marsh Posté le 17-08-2007 à 03:38:45    

peut etre qu'un fichier toto.bat avec dedans
start process1.exe
start process2.exe
...
...
 
pourrait t'aller

Reply

Marsh Posté le 17-08-2007 à 08:19:38    

Le soucis avec le start c'est les process sont lancés de façon indépendante et ne sont pas rattachés au CMD.EXE qui les lance. Donc quand le CMD.EXE est arreté les applications restent ouverte...

Reply

Marsh Posté le 17-08-2007 à 12:16:25    

Je ne sais pas si tes process ont besoin de continuer à tourner pendant que le 4 eme tourne aussi.
Parce que sinon tu peux faire avec la commande start /W
 
start /W process1.exe
start /W process2.exe
start /W process3.exe
start /W process4.exe
 
Le problème c'est qu'il vont s'exécuter toujours dans le même ordre et les uns à la suite des autres.
Faut voir si c'est possible dans ton cas ...

Reply

Marsh Posté le 17-08-2007 à 16:39:05    

Malheureusement le process4 a besoin que les 3 autres tournent donc ca ne convient pas...
 
J'ai essayé de faire ca en VBS mais ca n'a pas l'air très probant non plus...

Reply

Marsh Posté le 17-08-2007 à 16:39:05   

Reply

Marsh Posté le 17-08-2007 à 17:53:09    

Code :
  1. import java.applet.* ;
  2.  
  3.       import java.awt.* ;
  4.  
  5.       import java.io.*;
  6.       public class Exec
  7.       {
  8.        public static void main(String[] args)
  9.  
  10.        {
  11.          try
  12.          {
  13.  
  14.            Runtime r = Runtime.getRuntime();
  15.            Process p1 = r.exec("c:\\windows\\notepad.exe" );
  16.            Process p2 = r.exec("c:\\windows\\notepad.exe" );
  17.            Process p3 = r.exec("c:\\windows\\notepad.exe" );
  18.            Process p4 = r.exec("c:\\windows\\notepad.exe" );
  19.        //Test si le Process 4 est terminé
  20.            if (p4.waitFor()==0)
  21.            {
  22.           p1.destroy();
  23.           p2.destroy();
  24.           p3.destroy();
  25.              System.out.println("termine" );
  26.            }
  27.  
  28.          }
  29.          catch(Exception e)
  30.  
  31.          {
  32.            System.out.println("erreur d'execution " );
  33.  
  34.          }
  35.  
  36.         }
  37.  
  38.       }


 
Je te propose ca. Bon c'est du Java certes mais tu peux tjrs en faire un executable. Je n'ai testé qu'en lançant 4 process de notepad mais ca ma l'air de marcher.
Quand le process 4 est terminé (fermer la fenêtre notepad) les autres process sont killés.
Après ce n'est pas très propre vu qu'il n'y a aucun test mais c'est un début de solution peut-être pour toi.


Message édité par ju65 le 17-08-2007 à 23:25:16
Reply

Marsh Posté le 18-08-2007 à 08:45:01    

Je vais tester ca au boulot lundi, mais à vue de nez ca a l'air de correspondre à ce que je cherchais !
Merci beaucoup ju65

Reply

Marsh Posté le 18-08-2007 à 13:46:12    

De nada  :D  

Reply

Marsh Posté le 20-08-2007 à 10:17:18    

Ca marche parfaitement et la solution convient tout à fait à mon besoin.
Merci à toi !

Reply

Marsh Posté le 20-08-2007 à 13:55:59    

Parfait alors  :)  

Reply

Marsh Posté le 20-08-2007 à 14:05:25    

ça fait plaise de faire une daube en java rien que pour ça

Reply

Marsh Posté le 20-08-2007 à 14:40:29    

Taz a écrit :

ça fait plaise de faire une daube en java rien que pour ça


Si tu sais faire la même chose en VBS ou avec un .BAT je suis interessé hein, dans le cas contraire tu as perdu l'occasion de passer à coté d'une réflexion déplacée.

Reply

Marsh Posté le 20-08-2007 à 15:15:31    

le coup du bat qui lance les 4 process, c'est suffisant : dès que la fenêtre du bat est shootée (donc à la fermeture du client citrix) le cmd ouvert va butter de sang froid tout ce qu'il avait lancé.
 
j'ai le problème avec un batch de backup d'un ERP...
 
le batch arrête l'erp, fait le backup, puis le redémarre... sauf que si un con ferme la fenêtre "ne surtout pas toucher.bat" bah ça coupe le serveur d'un coup :D
 
autre exemple, cette fois pour le client du même ERP :


@echo off
 
echo ###############
echo # GENERIX.BAT #
echo ###############
echo.
echo # V5.2-00
echo.
echo Veuillez attendre que cette fenetre se ferme toute seule
echo lorsque vous aurez fini de travailler avec Generix.
echo.
exe\u_net.exe > msg.log
exe\u_ipc.exe detruire spvr * > msg.log
exe\u_net.exe > msg.log
start /wait exe\menunt.exe > msg.log
exe\u_net.exe > msg.log
exe\u_ipc.exe detruire spvr * > msg.log
com\utils\sleep.exe 2 > msg.log
exe\u_net.exe > msg.log
exit


 
analogiquement tu devrait faire :


@echo off
process1.exe
process2.exe
process3.exe
start /wait process4.exe
exit


 
=> Ca lance les 3 premiers process.
=> Ca lance le 4 et ça reste en pause tant qu'il tourne.
=> Dès qu'il s'arrête, cmd s'arrête et s'occupe de virer tout ce qu'il a démarré.

Message cité 1 fois
Message édité par MagicBuzz le 20-08-2007 à 15:17:54
Reply

Marsh Posté le 20-08-2007 à 15:33:31    

Dans mon cas de figure les 3 .EXE qui doivent être "liés" à la présence du 4e ne rendent pas la main au CMD.EXE quand ils sont lancés : si j'applique ce que tu dis il ne lance que le 1er, le 2e est lancé à la fermeture du 1e et le 3e à la fermeture du 2e.
Donc dans ton cas pas de soucis mais dans le mien ce n'est pas exploitable.
Enfin le programme en Java faisant exactement ce que je veux ce n'est plus très grave :)
 

MagicBuzz a écrit :

le coup du bat qui lance les 4 process, c'est suffisant : dès que la fenêtre du bat est shootée (donc à la fermeture du client citrix) le cmd ouvert va butter de sang froid tout ce qu'il avait lancé.
 
j'ai le problème avec un batch de backup d'un ERP...
 
le batch arrête l'erp, fait le backup, puis le redémarre... sauf que si un con ferme la fenêtre "ne surtout pas toucher.bat" bah ça coupe le serveur d'un coup :D
 
autre exemple, cette fois pour le client du même ERP :


@echo off
 
echo ###############
echo # GENERIX.BAT #
echo ###############
echo.
echo # V5.2-00
echo.
echo Veuillez attendre que cette fenetre se ferme toute seule
echo lorsque vous aurez fini de travailler avec Generix.
echo.
exe\u_net.exe > msg.log
exe\u_ipc.exe detruire spvr * > msg.log
exe\u_net.exe > msg.log
start /wait exe\menunt.exe > msg.log
exe\u_net.exe > msg.log
exe\u_ipc.exe detruire spvr * > msg.log
com\utils\sleep.exe 2 > msg.log
exe\u_net.exe > msg.log
exit


 
analogiquement tu devrait faire :


@echo off
process1.exe
process2.exe
process3.exe
start /wait process4.exe
exit


 
=> Ca lance les 3 premiers process.
=> Ca lance le 4 et ça reste en pause tant qu'il tourne.
=> Dès qu'il s'arrête, cmd s'arrête et s'occupe de virer tout ce qu'il a démarré.


 
 

Reply

Marsh Posté le 20-08-2007 à 15:47:39    

bourdel :o
 
tu colles un start devant process1.exe, process2.exe et process3.exe alors :o

Reply

Marsh Posté le 20-08-2007 à 15:48:14    

bouffer 500 Mo de JVM par session utilisateur juste pour lancer une bouse qui démarre 4 programmes :o
va pas durer longtemps ton citrix :sweat:

Message cité 1 fois
Message édité par MagicBuzz le 20-08-2007 à 15:48:27
Reply

Marsh Posté le 20-08-2007 à 16:01:40    

MagicBuzz a écrit :

bourdel :o
 
tu colles un start devant process1.exe, process2.exe et process3.exe alors :o


 
Avec un start devant à la fin de l'exécution du .bat les process ne sont pas tués

Reply

Marsh Posté le 20-08-2007 à 16:03:05    

MagicBuzz a écrit :

bouffer 500 Mo de JVM par session utilisateur juste pour lancer une bouse qui démarre 4 programmes :o
va pas durer longtemps ton citrix :sweat:


 
Ca bouffe 20 Mo de mémoire (physique + virtuelle), sur 16 Go de RAM ca ne devrait pas être trop genant (surtout que cette appli est peu utilisée) :)

Reply

Marsh Posté le 20-08-2007 à 16:14:28    

ouais enfin c'est quand même complètement overkill. Tu peux aussi faire une VM qui va faire un appel RPC pour lancer l'opération

Reply

Marsh Posté le 20-08-2007 à 17:56:57    

juste par curiosité et si c'est pas trop indiscret c'était pour quoi que t'avais besoin de faire ce bat (enfin un prog java maintenant :p) ?

Reply

Marsh Posté le 20-08-2007 à 21:19:25    

Bon ok mon prog est lourd j'avoue  :) . Mais bon je ne vois toujours pas d'autre proposition pour l'instant plus légère. J'attends voir comment vous faites ça en .bat ou autre ...
 
 

Reply

Marsh Posté le 20-08-2007 à 22:54:05    

Ben déjà tu peux le faire en VBS, ça évite d'avoir une JVM en mémoire pour rien... WSH est de toute façon loadé par le système et est quand même bien plus light que Java.

Reply

Marsh Posté le 20-08-2007 à 23:06:22    

MagicBuzz a écrit :

Ben déjà tu peux le faire en VBS, ça évite d'avoir une JVM en mémoire pour rien... WSH est de toute façon loadé par le système et est quand même bien plus light que Java.


 
Oui oui c'est sur que la JVM en mémoire ... c'est pas nécessaire pour un prog comme ça.  
J'ai été à la solution la plus rapide, c'était surtout pour aider notre cher ami zeaurelien.  
Mais finalement je trouve ca plutôt intéressant  :D  j'vais essayer de voir du côté d'autres langages pour réaliser ça autrement ... quand j'aurais 5 minutes ^^

Reply

Marsh Posté le 21-08-2007 à 00:02:43    

Ben en gros, tu modifies ton code à la sauce VB et c'est pareil ;)
 

Code :
  1. Option Explicit
  2.  
  3. Dim WShell
  4. Dim p1, p2, p3
  5.  
  6. Set WShell = CreateObject("WScript.Shell" )
  7.  
  8. ' Démarrage des 3 programmes en assynchrone
  9. Set p1 = WShell.Exec("notepad" )
  10. Set p2 = WShell.Exec("notepad" )
  11. Set p3 = WShell.Exec("notepad" )
  12.  
  13. ' Exécution du 4 et attente de la fin de ce dernier
  14. Call WShell.Run("calc",,true)
  15.  
  16. ' Arrêt des trois premiers
  17. p1.Terminate()
  18. p2.Terminate()
  19. p3.Terminate()
  20.  
  21. MsgBox("Terminé" )


Message édité par MagicBuzz le 21-08-2007 à 00:08:43
Reply

Marsh Posté le 21-08-2007 à 00:20:17    

Oué d'accord c'était tout simple en fait. Lors de ma recherche initiale j'avais + opté pour un truc du genre WaitFor(). et la recherche dans les fonctions associées aux processus. C'est vrai qu'avec WShell c'est super simple.  :)  
Bien joué MagicBuzz

Reply

Marsh Posté le 21-08-2007 à 10:31:22    

Décidément je suis gaté, MagicBuzz ta solution en VBS marche effectivement très bien.
Merci à vous deux, à ju65 pour avoir débloqué un soucis que j'avais en production (le critère N° était sur le coup d'avoir un truc rapidement fonctionnel) et à MagicBuzz pour avoir une solution plus "propre".
:)

Reply

Marsh Posté le 21-08-2007 à 19:20:37    

ceci dit, ça doit se faire en bat aussi... mais là c'est vrai que je sèche un peu, pis c'est pas super documenté...
 
faudrait trouver un vieux au fond de sa caverne avec du MSDOS moussu sur les épaules, il pourrait peut-être nous dire.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed