Aller au contenu

%SHTDN

Arrêt du système demandé ?

Indique si le système est en cours d'arrêt, pour qu'un traitement long puisse s'interrompre proprement.

Syntaxe

%SHTDN
Résultat
Un indicateur : *ON si un arrêt du système est demandé, *OFF dans le cas normal.

À quoi ça sert

Un traitement qui tourne des heures (batch de nuit, serveur qui boucle sur une file de données) doit pouvoir s'arrêter proprement quand le système va s'éteindre : terminer l'enregistrement en cours, fermer les fichiers, et non se faire interrompre au milieu d'une mise à jour. On teste %SHTDN à chaque tour de boucle.

Exemple 1 : Boucle de lecture qui surveille l'arrêt

**free
// %SHTDN : le systeme demande-t-il l'arret ? Test a placer dans une boucle longue.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);

dcl-f client keyed usage(*input);

dcl-s traites int(10);

snd-msg 'Arret demande au depart ? ' + %char(%shtdn);

read client;
dow not %eof(client);
  // A chaque tour : si l'operateur arrete le systeme, on sort proprement.
  if %shtdn;
    snd-msg 'Arret du systeme demande : on s''arrete au client ' + %char(numcli);
    leave;
  endif;
  traites += 1;
  read client;
enddo;
close client;

snd-msg 'Clients traites : ' + %char(traites);
snd-msg 'Arret demande a la fin ? ' + %char(%shtdn);

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Arret demande au depart ? 0
Clients traites : 5
Arret demande a la fin ? 0

À chaque client lu, la boucle teste %shtdn. Ici aucun arrêt n'est demandé : le test reste faux du début à la fin, et les 5 clients sont traités. En cas d'arrêt demandé, la boucle sortirait par leave.

Le piège

Pensez à le tester à chaque tour de boucle, pas seulement au départ. Dans l'exemple, la valeur est 0 (faux) au début comme à la fin : un arrêt du système n'a pas pu être provoqué pendant le test, donc la sortie par leave n'a pas été exécutée.