Timeout de la fonction tryJ'ai un seul script qui appelle de nombreux autres scripts pour les processus de création de rapports sur les équipements et les rapports de construction. Parfois, les données provenant des outils de processus incluent des erreurs que JMP ne peut pas gérer.J'ai donc enveloppé les appels dans une fonction Try() comme celle-ci :
For(ii=1, ii < nitems(BulkScriptsToRun), ii++,
try(
Include( BulkScriptsToRun[ii] );
);
);
Parfois, le script inclus ne plante pas, mais il ne se termine pas non plus.
Bien que cela puisse probablement être résolu en modifiant le script et la manière dont il traite les données, ce ne sont pas mes scripts à modifier.
Existe-t-il un moyen de faire en sorte que la fonction try considère l'essai comme un échec si cela prend plus d'une heure, par exemple?
Existe-t-il un autre moyen d'y parvenir? Existe-t-il un moyen de dire à Try() qu'il doit abandonner?
Merci
ScriptRe : Timeout de la fonction tryNon, try() n'a pas de mécanisme de timeout ; il est très similaire au mécanisme try-throw-catch de C++. Comme vous le devinez, vous devez mettre la logique dans chacun des scripts inclus, ce qui pourrait faire quelque chose comme
startSeconds = tickSeconds();
...
while(...
if( tickseconds() - startSeconds > 100, throw("Used more than 100 seconds") );
...)
Je sais que vous avez dit que vous ne pouviez pas ouvrir ces scripts pour les modifier, mais si vous le faisiez, vous voudrez peut-être qu'ils rappellent votre code pour indiquer la progression. Ensuite, vous pouvez faire le lancer depuis le rappel si nécessaire. Dans tous les cas, vous devez trouver un point dans chacun des scripts où une boucle répète quelque chose, et le délai d'attente dépend du comportement raisonnable du script (pour continuer à vérifier l'heure).
Le planificateur de tâches Windows pourrait également faire partie de la solution ; Je ne l'ai pas utilisé mais il y a eu un certain nombre de fils de discussion qui posaient des questions à ce sujet. Puis-je fermer le programme jmp à partir d'un script ?pourrait suggérer quelque chose.
Re : Timeout de la fonction tryCela ressemble à quelque chose qui pourrait être fait avec le planificateur de tâches Windows si vous ne pouvez pas modifier les scripts. Créez un script qui inclut les autres scripts, gérez toutes les erreurs que vous pouvez dans votre script "d'inclusion" et ajoutez un délai d'expiration à la tâche des planificateurs. Une fois le temps écoulé, il mettra fin à l'exécution où qu'il se trouve.
En général, l'exécution d'un lot de scripts sur lesquels vous n'avez pas le contrôle peut rapidement devenir désordonné car vous devrez peut-être gérer beaucoup de choses différentes (j'ai dû faire quelque chose comme ça). Voici quelques problèmes (ou opportunités d'amélioration) auxquels j'ai été confronté :
- Gérer les collisions d'espaces de noms
- Supprimer/Effacer les symboles inutiles
- Survivre à une situation où les scripts n'utilisent pas les noms par défaut jusqu'ici (1)
- Survivre à l'utilisation de Clear Symbols / Delete Globals dans le script inclus
- Fermez les tableaux de données et les rapports inutiles pour économiser de la mémoire
- Détection des erreurs qui arrêteraient JMP
- Utilisation de Quitter/Quitter dans les scripts inclus
- Journaliser l'exécution du script pour savoir ce qui a été exécuté correctement
La plupart d'entre eux sont beaucoup plus faciles à gérer en entraînant/modifiant les scripts inclus.
Re : Timeout de la fonction tryJ'exécute le script maître à partir du planificateur de tâches.Et je peux temporiser là-bas. Mais si l'un des scripts a la même erreur heure après heure, jour après jour, tous les scripts en dessous de celui de la liste ne seront jamais exécutés.
De la façon dont le script principal est organisé, les scripts plus tard sur la liste sont exécutés moins fréquemment, il peut donc prendre des semaines pour remarquer qu'ils sont entièrement ignorés.Je pourrais simplement inverser l'ordre de la liste - mais les scripts qui doivent être exécutés toutes les 10 minutes sont ignorés à chaque fois jusqu'à ce que je corrige le problème dans le script problématique (c'est pire).
En outre, le script principal signale sa propre progression après l'exécution de tous les scripts.Cela ne se produira jamais si la tâche est tuée.
Ma solution actuelle est la suivante : commentez le script problématique et attendez que la partie responsable s'en soucie suffisamment pour le réparer.
Ça marche.