Dollar Universe : pourquoi la reprise après incident se décide à la conception
Ordonnancement · Continuité d’exploitation
L’alerte part, l’astreinte ouvre Univiewer et trouve une uproc en ABORTED. Le statut est exact, et parfaitement insuffisant : il indique qu’un traitement s’est arrêté. Il ne dit ni ce qui a été traité avant l’arrêt, ni à partir d’où la chaîne peut repartir sans produire de dégâts.
Dans un incident d’ordonnancement, le temps de la panne pèse peu. C’est le temps de l’arbitrage qui coûte : reconstituer le périmètre réellement traité, choisir un point de reprise, obtenir l’accord de l’application concernée. Ce délai ne dépend presque pas de qui est de garde ce soir-là. Il dépend de la façon dont le plan de production a été conçu, plusieurs mois plus tôt.
Cet article porte sur ce second temps, dans un contexte précis et rarement documenté : Dollar Universe sous Windows Server, des traitements en BAT et PowerShell, et des chaînes qui appellent SAP ou des services extérieurs au système d’information.
Trois idées, si vous ne lisez que ça
La reprise se prépare à la conception, pas pendant l’incident. Un plan découpé finement, nommé dans le vocabulaire du métier et documenté se reprend en quelques minutes. Un plan monolithique se reprend en heures, quelle que soit la compétence de la personne qui l’ouvre en pleine nuit.
Les chaînes qui sortent du système d’information cassent différemment. Dollar Universe raisonne en synchrone : il lance, il attend, il récupère un code retour. La plupart des services externes rendent la main avant d’avoir terminé leur travail. Tant que cet écart n’est pas traité explicitement, le plan de production tient pour acquis des choses fausses.
Un statut n’est pas une trace. ABORTED décrit une exécution interrompue. Ce qui permet de reprendre, c’est ce que le traitement a écrit lui-même avant de s’arrêter.
ABORTED est un constat, pas un diagnostic
Dollar Universe fait exactement ce qu’on lui demande : il exécute, il surveille, il enchaîne si le code retour est conforme, il s’arrête sinon. Le statut d’une uproc décrit l’état de l’exécution telle que l’ordonnanceur l’a observée. Rien de plus, et c’est déjà beaucoup.
Ce qu’il ne contient pas, c’est l’état du système en aval. Une uproc qui déclenche un traitement de facturation et qui part en ABORTED au bout de trente minutes recouvre trois situations très différentes : rien n’a été écrit, une partie du périmètre a été traitée, ou l’intégralité du traitement s’est déroulée correctement et seule la remontée du résultat a échoué. Les trois produisent le même statut. Les trois appellent une décision opposée.
C’est là que se perd le temps d’un incident. Pas dans le diagnostic technique, qui prend quelques minutes, mais dans la reconstitution de ce qui s’est réellement passé, et dans les échanges avec l’application concernée pour valider un point de reprise. Une organisation qui veut réduire son temps d’indisponibilité ne gagne pas grand-chose à surveiller mieux. Elle gagne à rendre ses chaînes interprétables.
Ce qui se décide à la conception, et qui se paie au premier incident
L’uproc qui enchaîne huit opérations ne se relance qu’en entier. Découper le traitement en autant d’uproc que d’actions métier identifiables multiplie les points de reprise et transforme un arbitrage difficile en décision évidente. Le coût est un plan plus fourni et davantage de dépendances à déclarer ; le bénéfice se mesure dès le premier incident, et il ne se rattrape pas après coup.
Un plan nommé selon des conventions purement techniques oblige à traduire avant de pouvoir décider quoi que ce soit. Un plan nommé avec les mots que l’application utilise, ceux du flux, du domaine et de l’étape tels que le métier les désigne, permet à quelqu’un qui découvre la chaîne de comprendre ce qu’il regarde. La convention retenue importe moins que son alignement sur le vocabulaire de l’entreprise.
Ce que l’ordonnanceur consigne décrit l’exécution. Ce dont on a besoin pour reprendre décrit le périmètre traité : quel lot, quelles données, jusqu’où. Cette trace ne peut être produite que par le traitement lui-même, au fil de l’eau, dans un fichier horodaté lisible sans outil particulier. C’est le chantier le moins spectaculaire, et celui dont le retour est le plus rapide.
Là où l’ordonnanceur cesse de savoir
Un traitement local est simple à ordonnancer. Le script tourne, il se termine, il rend un code. L’ordonnanceur sait précisément quand l’étape est finie, parce qu’il tient le processus.
Dès qu’un système externe entre en jeu, ce contrat se rompt. Sur SAP, le Manager for SAP Solutions permet de déclencher un job et d’en suivre l’exécution, ce qui règle une grande partie du problème : la surveillance est prise en charge par le composant, pas par un script maison. Mais dès qu’on sort du périmètre couvert par un Manager, appel d’API, service tiers, plateforme d’intégration, c’est au traitement d’assurer lui-même la surveillance. Déclencher, conserver l’identifiant de l’appel distant, interroger périodiquement son état, puis traduire cet état en code retour intelligible pour l’uproc.
Cette boucle, il faut l’écrire, et c’est là que se logent les erreurs qui coûtent une nuit. Un script qui déclenche puis rend la main immédiatement fait passer l’uproc en succès alors que le travail commence à peine. La suite de la chaîne démarre sur des données incomplètes. C’est le scénario le plus coûteux de tous, parce que l’incident ne se déclare pas à l’étape fautive mais deux ou trois étapes plus loin, sur un symptôme sans rapport apparent avec la cause.
Ce qu’il protège, ce qu’il laisse ouvert
La parade habituelle consiste à poser une durée maximale dans les paramètres de l’uproc. Elle est indispensable : sans cette borne, une uproc bloquée sur un service qui ne répond plus immobilise le plan de production jusqu’au matin, et l’incident cesse d’être local pour devenir général.
Mais un timeout protège la chaîne, il n’informe personne. Quand il se déclenche, il produit précisément la situation qu’on cherchait à éviter : une uproc en anomalie, et aucune indication sur l’état réel du traitement distant. Le service externe a peut-être terminé une seconde plus tard. Il a peut-être traité la moitié du périmètre. Rien dans le plan de production ne permet de le savoir.
D’où une règle simple, et qui ne coûte presque rien à appliquer : tout appel vers l’extérieur doit produire sa propre trace, indépendamment du statut renvoyé à l’ordonnanceur. Un fichier horodaté, écrit par le traitement, qui consigne l’identifiant de l’appel distant, l’heure de déclenchement, les étapes franchies et le dernier état connu. C’est ce fichier, et non le statut de l’uproc, qui permet de décider d’un point de reprise en trois minutes plutôt qu’en trente.
Découpage des uproc, conventions de nommage, traçabilité des appels externes, procédures de reprise : nous regardons votre plan de production tel qu’il est, et nous vous disons ce qui allongera votre prochain incident. Interventions au mois, sur site et à distance, partout en France.
Section technique — le reste de l’article se lit sans elle
La documentation de Dollar Universe, comme la quasi-totalité des retours d’expérience disponibles en ligne, décrit des environnements Unix et des traitements en shell. Les plans de production sous Windows Server, avec des scripts BAT et PowerShell, sont pourtant nombreux, et ils posent des problèmes qui leur sont propres.
Le code retour est le piège numéro un. Un script PowerShell se termine par défaut avec un code nul, y compris lorsqu’une exception a été levée en cours de route. L’uproc voit un succès, la chaîne continue, et l’erreur ne se manifeste que plus loin. Trois réflexes ferment ce trou : positionner $ErrorActionPreference sur Stop en tête de script, encadrer le corps du traitement dans un bloc try/catch, et terminer par un exit explicite dont la valeur est décidée par le script. Si le script appelle un exécutable externe, c’est $LASTEXITCODE qu’il faut relayer, et non le résultat de la commande PowerShell qui l’enveloppe.
Le script qui fonctionne en manuel et échoue en ordonnancé est le second classique, et la cause est presque toujours la même. L’exécution manuelle se fait sous votre compte, dans votre session ouverte, avec vos lecteurs réseau montés et votre profil chargé. L’uproc, elle, s’exécute sous le compte de service, sans profil, sans lecteur mappé, avec sa propre politique d’exécution. Les corrections sont connues : chemins UNC absolus plutôt que lettres de lecteur, aucun chemin relatif, politique d’exécution vérifiée pour le compte concerné, variables d’environnement déclarées dans le script plutôt que supposées présentes.
L’encodage ferme la liste, et c’est le plus rageant. Un script qui écrit des accents dans un fichier de trace peut produire un contenu illisible selon la page de code active, ce qui rend inexploitable exactement le document dont on a besoin en pleine nuit.
Ce qu’il faut en retenir si ces détails ne sont pas votre métier : un traitement qui remonte un statut faux est plus dangereux qu’un traitement qui échoue franchement. La fiabilité d’un plan de production se joue autant dans le code des scripts que dans le paramétrage de l’ordonnanceur.
Quatre chantiers, dans l’ordre où nous les ouvrons
Documenter le plan de production et les procédures de reprise. Reprendre chaîne par chaîne ce que fait chaque uproc, ce dont elle dépend, et ce qu’il faut vérifier avant de la relancer. C’est le chantier le moins visible et celui qui change le plus de choses au premier incident.
Fiabiliser les scripts. Codes retour explicites, traces horodatées, gestion propre des appels vers les systèmes externes, suppression des dépendances implicites à un profil ou à un lecteur mappé.
Paramétrer et faire évoluer. Création et refonte d’uproc, de sessions, de tâches, de règles de dépendance et de business views, avec un découpage pensé pour la reprise plutôt que pour la seule exécution.
Renforcer l’équipe ponctuellement. Surveillance du plan de production, traitement des incidents et relances, en appui d’une équipe en sous-effectif ou pendant une période de charge.
Nos interventions se font en mode mixte, sur site et à distance, partout en France, sur des engagements au mois. Nous n’assurons pas d’astreinte permanente et nous ne conduisons pas de migration d’ordonnanceur : notre terrain, c’est le contenu des chaînes et leur fiabilité.
Questions fréquentes
Non, et c’est précisément le problème. Le statut décrit l’exécution observée par l’ordonnanceur, pas l’état du système en aval. Un traitement peut avoir écrit une partie de son périmètre, ou l’intégralité, avant que la remontée échoue. Seule une trace produite par le traitement lui-même permet de trancher.
Uniquement si le traitement est rejouable, c’est-à-dire s’il produit le même résultat qu’on l’exécute une fois ou trois. Beaucoup ne le sont pas : ils créent des écritures, émettent des fichiers, incrémentent des compteurs. La question à se poser avant toute relance n’est pas technique mais fonctionnelle, et elle se tranche avec l’application concernée.
C’est la règle que nous appliquons, et elle se justifie par la reprise. Une uproc qui enchaîne plusieurs opérations ne se relance qu’en entier, ce qui interdit toute reprise partielle et allonge d’autant l’arbitrage en pleine nuit. Le plan devient plus fourni et les dépendances plus nombreuses à déclarer, mais chaque étape devient un point de reprise possible.
Celle qui reprend le vocabulaire du métier. La convention retenue importe moins que son alignement sur les mots que l’entreprise emploie pour désigner ses flux, ses domaines et ses étapes. Un nommage purement technique oblige à traduire avant de décider, et cette traduction se paie en minutes à chaque incident.
En traitant explicitement l’écart entre le fonctionnement synchrone de l’ordonnanceur et le fonctionnement asynchrone du service appelé. Déclencher, conserver l’identifiant de l’appel, interroger périodiquement son état, borner l’attente par un timeout, écrire une trace à chaque étape. Sans cette boucle, l’uproc rend un statut qui ne correspond pas à la réalité.
Il protège la chaîne, puisqu’il évite qu’une uproc reste bloquée toute la nuit sur un service qui ne répond plus. Il ne protège pas la reprise : quand il se déclenche, personne ne sait où en était le traitement distant. Un timeout doit toujours s’accompagner d’une trace écrite par le traitement lui-même.
Parce que le contexte d’exécution diffère. L’uproc s’exécute sous le compte de service, sans votre profil, sans vos lecteurs réseau mappés et avec sa propre politique d’exécution. Les causes les plus fréquentes sont les chemins relatifs, les lettres de lecteur, les variables d’environnement supposées présentes et les droits du compte de service sur les répertoires visés.
Parce qu’un script PowerShell se termine par défaut avec un code retour nul, même après une exception. Il faut positionner $ErrorActionPreference sur Stop, encadrer le traitement dans un try/catch et terminer par un exit explicite. Si le script appelle un exécutable externe, c’est la valeur de $LASTEXITCODE qu’il faut relayer.
En mode mixte, sur site et à distance, partout en France, sur des engagements au mois. Ce format permet de mener des chantiers de fond, documentation, fiabilisation, refonte du découpage, plutôt que de traiter des incidents isolés. Nous n’assurons pas d’astreinte permanente et nous ne conduisons pas de migration vers un autre ordonnanceur.
Dollar Universe sous Windows, chaînes vers SAP ou services externes, documentation à reprendre : dites-nous où vous en êtes.
Nous vous répondons sur ce que nous pouvons faire, sous quel format et dans quel délai.