OVH Cloud OVH Cloud

Tester l'exécution d'un script

17 réponses
Avatar
SupDePlouf
Bonjour,

Comment tester dans un script batch qu'un auture script batch est en cours
d'exécution ou non ?

Merci
--
SupDePlouf

7 réponses

1 2
Avatar
Méta-MCI
Salut !

Il y a un truc qui m'échappe...

Je prend un exemple. J'ai différents batchs, lancés, soit manuellement, soit
par des tâches planifiées, soit par d'autres évènements.
Appelons-les test1.bat, test2.bat, test3.bat, etc.

D'après ton système, ces batchs seront lancés, chacun, dans un job
différent.

Par ailleurs, j'ai des batch de service, pour des opérations de
synchronisation, sauvegarde, archivage, documentation. Appelons-les s1.bat,
s2.bat, s3.bat, sauvegarde.bat, etc.

Les batchs testX.bat peuvent, si certaines conditions sont remplies (par
exemple, le 1er jour du mois), appeler des batchs sX.bat ; le plus souvent
par des CALL sX.bat, mais, cela arrive aussi, directement: sX.bat


Si je cherche à savoir, dans le batch test2.bat, si le batch sauvegarde.bat
est en cours d'exécution, j'ai peur de ne pas avoir la bonne réponse (par
exemple, s'il a été lancé par test1.bat, avec un CALL sauvegarde). En effet,
ton système gère le job associé à test1.bat, et ne verra pas sauvegarde.bat

Autres infos, inutiles, mais pour préciser les conditions d'utilisation :
Les batch de services peuvent durer de quelques secondes à plusieurs heures.
Il m'arrive souvent d'installer les batchs d'appels sur les postes, et les
batch de services sur des serveurs.
Cette structure de batchs (qui ressemble à une librairie d'utilitaires), je
l'utilise systématiquement, chez tous mes clients.


@-salutations

Michel Claveau





PS : à une époque, je m'en sortais en gérant un mutex, avec un programme
externe. Cela revenait au même qu'utiliser un fichier-repère, sauf pour la
persistance après re-boot (tout mutex étant détruit à l'extinction du
poste).
Mais, à cause du fonctionnement en réseau, je suis revenu au système du
fichier-repère, qui présente l'avantage d'être multi-poste. Cela permet à un
poste d'éviter de lancer un archivage, si un autre poste a déjà ce
traitement en cours. En plus, le fichier-repère permet de savoir à quelle
heure le batch a été lancé, et avec toutes les autres indications que l'on
aura mises dedans.
Avatar
Gilles LAURENT
"Méta-MCI" a écrit dans le message de
news:%
| Salut !

Bonjour,

| Je prend un exemple. J'ai différents batchs, lancés, soit
| manuellement, soit par des tâches planifiées, soit par d'autres
| évènements.
| Appelons-les test1.bat, test2.bat, test3.bat, etc.
|
| D'après ton système, ces batchs seront lancés, chacun, dans un job
| différent.

Oui, si on veut être en mesure de surveiller ces trois jobs

| Si je cherche à savoir, dans le batch test2.bat, si le batch
| sauvegarde.bat est en cours d'exécution, j'ai peur de ne pas avoir la
| bonne réponse (par exemple, s'il a été lancé par test1.bat, avec un
| CALL sauvegarde). En effet, ton système gère le job associé à
| test1.bat, et ne verra pas sauvegarde.bat

Tout à fait. Ce concept ne permet pas de tracer l'exécution des batchs
mais uniquement d'être en mesure de déterminer si un job est en cours
d'exécution ou pas. Pour reprendre votre exemple, si test2.bat veut
savoir si le batch sauvegarde.bat est en cours d'exécution alors
test1.bat devra lancer sauvegarde.bat en tant que job :

+++ Exemple (non testé)

--- sauvegarde.bat ---
:: le script est lancé en tant que job
:: démarrage des sauvegardes des serveurs distants
:: parallélisation du traitement
start robocopy server1
start robocopy server2
start robocopy server3

:: le script sauvegarde.bat est terminé mais pas le job
:: les processus robocopy.exe sont en cours d'exécution
:: le job sera automatiquement détruit à la fin des sauvegardes

--- test1.bat ---
:: démarrage de sauvegarde.bat en tant que job
:: batch_sauvegarde ne fait donc pas partie du job batch_test1
:: il n'y a pas de notion de job enfant
job3_14.exe -run sauvegarde.bat -jobname batch_sauvegarde

:: on attend la fin du job (émulation du call)
job3_14.exe -wait -jobname batch_sauvegarde

--- test2.bat ---
job3_14.exe -status -jobname batch_sauvegarde || (
echo Le batch sauvegarde.bat est en cours ...
echo Attente de la fin du traitement
job3_14.exe -wait -jobname batch_sauvegarde
)

:: le job batch_sauvegarde est terminé
:: traitement des logs

| Il y a un truc qui m'échappe...

Donc pas du tout. Vous aviez bien compris le principe de fonctionnement.
L'idée était d'être en mesure de savoir si un script batch (au sens job)
était en cours d'exécution et cela, quoi que fasse le script batch
(commandes externes, processus détachés, ...)

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
SupDePlouf
Bonjour et MERCI à tous

Je me permets de vous préciser un peu les choses...

En fait, j'ai script "Kix" qui copie des fichiers depuis le répertoire Rep1
vers le répertoire Rep2.

Ce script doit imperativement tourner.

Mon idée est de tester régulièrement par une tâche planifiée que ce script
est bien en fonction et si ce n'est pas le cas, le relancer.

J'ai bien pensé à utiliser le principe des fichiers-répères mais si la
machine, ou le script, s'arrête de façon inattendue le fichier est toujours
présent et le test suivant considérera que le script tourne toujours.

J'ai fait en sorte que ce script "Kix" par l'intermédiaire d'un batch du type

--- toto.bat
kix32.exe script.kix
--- toto.bat

soit lancé à chaque démarrage de la machine.

Je souhaite me prémunir d'un arrêt inattendu en surveillant, d'une façon ou
d'une autre, que ce batch ou ce script.kix tourne bien.

Quelle est donc d'après vous la meilleure solution dans ce cas précis ?

Merci
--
SupDePlouf



Bonjour,

Comment tester dans un script batch qu'un auture script batch est en cours
d'exécution ou non ?

Merci
--
SupDePlouf


Avatar
Jacques Barathon [MS]
"SupDePlouf" a écrit dans le message
de news:
<...>
J'ai fait en sorte que ce script "Kix" par l'intermédiaire d'un batch du
type

--- toto.bat
kix32.exe script.kix
--- toto.bat

soit lancé à chaque démarrage de la machine.

Je souhaite me prémunir d'un arrêt inattendu en surveillant, d'une façon
ou
d'une autre, que ce batch ou ce script.kix tourne bien.

Quelle est donc d'après vous la meilleure solution dans ce cas précis ?


Je n'ai pas kix32 sur mon poste pour pouvoir tester, mais à priori la
première solution de Gilles (isRunning.vbs) devrait convenir après légère
adaptation:

Il faudrait remplacer la ligne:
"Where Name='cmd.exe'")
Par:
"Where Name="kix32.exe")

L'usage dans un batch de contrôle donnerait:

cscript //nologo isRunning script.kix || echo script.kix est toujours en
cours d'exécution.

Cela dit, le principe du fichier-repère reste valable en complément car il
peut donner des informations plus pertinentes que le fait de savoir que le
script est toujours en mémoire. Si pour une raison quelconque le script
tourne dans le vide et que les copies ne sont plus faites (par exemple à
cause d'un pb d'accès, ou d'une erreur dans un chemin), le "isRunning" ne
permettra pas de relever le problème.

Le script pourrait par exemple écrire dans un log à intervalles réguliers
et/ou à chaque étape clé, ce qui permettrait au batch de contrôle de savoir
non seulement si le script est toujours en vie mais en plus où il en est. La
solution exacte dépend étroitement de ce que fait le script (et donc de ce
qui doit être contrôlé et à quelles fréquences).

Jacques

Avatar
Michel Claveau
Bonsoir !

Je m'excuse de ne pas avoir répondu avant, mais j'ai été trop occupé.

J'ai un petit utilitaire qui permet de tester la présence d'un process
particulier, et, qui, s'il n'existe pas, lance une commande précise.

Dans les tâches planifiées, je lance régulièrement cet utiltaire
(toutes les heures, mais ça dépend de l'usage souhaité).

Je me demande si jça ne vaudrait pas le coup d'en déduire un utilitaire
plus général, de surveillance de quelques process, avec les commandes
correspondantes.

Il devrait être possible de grouper ça avec PSurv
(http://www.ponx.org/batutils), l'utilitaire de surveillance (et
d'interdiction) de process




Autre chose, tu dis utiliser Kixtart. J'ai quelques questions :
- l'aurais-tu déjà comparé à AutoIt ?
- as-tu utilisé la version dotNET de Kixtart ?
- as-tu déjà utilisé KixForms, l'extension GUI en COM ? Je l'utilise
dans certains scripts en Python, mais j'hésite à aller plus loin, ou à
choisir un autre GUI.




--
@-salutations

Michel Claveau
Avatar
Gilles LAURENT
Bonjour,

Après une phase de tests et de debugging, je propose aux lecteurs de ce
fil une version stable de l'outil de gestion des jobs en ligne de
commande : job3_14.exe v1.0.0.1. C'est ici :
http://glsft.free.fr/index.php?option=com_content&task=view&id&Itemid(

--
Gilles LAURENT
http://glsft.free.fr
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
valou75
Le mercredi 04 Octobre 2006 à 00:08 par Méta-MCI :
Bonsoir !
Cela dépend comment a été lancé le batch.
S'il a été lancé interactivement, il n'est pas possible de
savoir,
simplement, si le batch est en fonctionnement.
S'il a été lancé comme paramètre d'une ligne de
commande (par exemple, avec
un "cmd /ctemp.bat"), là, c'est possible.
Il suffit d'utiliser un batch de ce genre :
wmic process where name="cmd.exe" list full |find
"temp.bat"
En l'absence du nom du script dans la ligne de commande, il reste possible
de lister tous les process "cmd.exe" (comme le fait Gilles), avec le
mini-batch suivant :
wmic process where name="cmd.exe" list full |find
"CommandLine"
(pour avoir la ligne de commande)
ou
wmic process where name="cmd.exe" list full |find
"ProcessId"
(pour avoir le PID)
Mais je doute que cela réponde à ton besoin.
Une autre solution consiste à utiliser un signal, dans le premier batch
(par
exemple un fichier-repère), ouvert au début du batch, et
supprimé à la fin.
Si le signal existe, c'est que le batch est lancé.
Mais, il faut avoir la possibilité de modifier le batch...
@-salutations
Michel Claveau
Ca semble marcher ça:
wmic process where name="cmd.exe" GET processid, commandline
Retourne les bat en cours d'exe avec leurs nom et PID respectifs.
1 2