14 avril 2004

Mettre en place une file d'attente sous Unix avec "at"

En l'absence d'ordonnanceur, pour limiter le nombre de processus batch actifs, il est possible de soumettre ces travaux dans les files d’attentes Unix. Il y a 6 files d’attente; deux sont réservées pour le système, certaines à des shells particuliers (ex : f pour le csh). Préférer les queues a (aussi utilisée par la commande at - qu'il vaut donc mieux laisser le plus libre possible), b (aussi utilisée par la commande batch), et e :
  • "c" - cron events, réservée au système Unix
  • "d" - sync events, réservée au système Unix
  • "b" - batch jobs
Les autres sont dédiées à un langage shell :
  • "a" - sh jobs - at jobs 
  • "e" - ksh jobs 
  • "f" - csh jobs
Par défaut c'est la file "a" qui est utilisée. Une tâche peut toutefois être envoyée sur une autre queue ("e" dans cet exemple) à une heure particulière (21:20 dans notre exemple) :

echo "sh monshell.sh > $LOG/monlog.log" | at -qe 2120

La commande "at -l" permet de lister les travaux placés en attente, "at -r" de les supprimer :
at -l
hr.1044415211.e mar  4 fév 21:20:11 CST 2003


Le format du nom du travail est : <UserUnix>.<IdTravail>.<NomQueue>. Sur AIX ils sont stockés dans le répertoire /var/adm/cron/atjobs :
ls /var/spool/cron/atjobs/hr.*.?
/var/spool/cron/atjobs/hr.1044415211.e


Et la commande soumise peut être consultée en fin du fichier :
tail -1 /var/spool/cron/atjobs/hr.1044415211.e
sh monshell.sh > $LOG/monlog.log


Quand le nombre maximum de batch en cours d'exécution est atteint pour une file d'attente, les suivants restent dans le tampon du "at" (visibles par un "at -l") d'ici à ce qu'un des batch se termine et libère une place.

L'heure de soumission n'est donc pas forcément identique à l'heure de début d'exécution. Il pourra être nécessaire d'informer les utilisateurs de cette caractéristique. 

Mise en place

1) Faites paramétrer les files d'attente via le fichier /var/adm/cron/queuedefs (AIX).

Attention :
  • Ceci est de la prérogative de l'administrateur Unix de la machine,
  • Ce paramétrage est fait pour la machine, c'est a dire pour toutes les applications hébergées.

Par exemple pour 3 files d’attente nommées « e », « b » et « a » de respectivement 4, 4 et 9 batchs pour les paies à la demande, les paies de correction et explorations, les autre batch, avec comme priorités 20, 25, 30 (20 étant plus prioritaire que 25) :

e.04j20n60w
b.04j25n60w
a.09j30n60w


Signifie :
  • queue e : 4 batch (jobs) de priorité (nice) normale (20),
  • queue b : 4 batch de priorité réduite (25),
  • queue a : 9 batch de priorité basse (30),
  • bilan (wait) toutes les 60 secondes
2) Sous HR Access, modifiez le script ${SIGACS}/bin/job.

Exemple ci joint :
- les paies à la demande NJL sont lancées sur la queue e
- les paies de correction et explorations sur la queue b
- tous les autre batch sur la queue a

...
# Lancement d'un script de $SIGACS/bin
if [ ! "$T" ]
then
  JSCRI=`echo "$PARAM"|cut –c14-21| tr –d ‘ ‘`
  case ${JSCRI} in
  [A-Z,0-9]*NJL)
  echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qe now 2>> $TMP/a.batch
    ;;
  [A-Z,0-9]*NJC|[A-Z,0-9]*NBX)
  echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qb now 2>> $TMP/a.batch
    ;;
  *)
  echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qa now 2>> $TMP/a.batch
    ;;
  esac
else
...

Mettre en place une file d'attente sous Unix avec qconfig

Sous système AIX, le fichier /etc/qconfig décrit les queues et matériels disponibles par la commande enq, laquelle place les requêtes en attente, et par qdaemon, qui exécute les actions et nettoie la queue. En temps normal ce système est utilisé pour les impressions, mais il est possible de l'utiliser pour l'exécution de traitements.

Exemple :
Une queue de traitements batch se déclare de cette façon :
bsh:
  discipline = fcfs
  device = bshdev
bshdev:
  backend = /usr/bin/ksh


Pour exécuter un script nommé MonShell.sh en utilisant cette queue batch, tapez :
qprt -Pbsh MonShell.sh

Le système exécute les traitements un par un, dans l'ordre dans lequel ils ont été soumis. Le processus qdaemon redirigera les sorties standard (input, standard output, et erreur) vers /dev/null (la poubelle).

Pour permettre l'exécution de deux traitements en parallèle, déclarez :
bsh:
  discipline = fcfs
  device = bsh1,bsh2
bsh1:
  backend = /usr/bin/ksh
bsh2:
  backend = /usr/bin/ksh


Il est même possible de demander un traitement sur un serveur distant ! Ci dessous par exemple, on crée localement une queue nommée "remh" qui passera la commande à la queue "bsh" préalablement déclarée sur un serveur "pluto" (à référencer dans le etc/hosts ou le DNS de l'entreprise) :

remh: 
  device = rd0 
  host = pluto 
  rq = bsh 
rd0: 
  backend = /usr/lib/lpd/rembak

A noter :
  • La commande "enq" convertit automatiquement le fichier qconfig en binaire (/etc/qconfig.bin).
  • Le fichier qconfig ne doit pas être édité tant que des travaux sont présents dans les queues (édition manuelle ou via commande mkque, rmque, chque, mkquedev, rmquedev, chquedev),
  • La commande "enq -G" suspend la queue une fois tous les traitements terminés,
  • La commande "startsrc -s qdaemon" redémarre le démon.

Mise en place


Je n'ai pas eu l'occasion de tester cet outil, mais il me semble intéressant ...
Ci dessous ce que j'en ferais :

1) Faites paramétrer les files d'attente via le fichier /etc/qconfig (AIX).

Attention :
  • Ceci est de la prérogative de l'administrateur Unix de la machine, 
  • Ce paramétrage est fait pour la machine, c'est a dire pour toutes les applications hébergées.

Par exemple pour 3 files d’attente nommées « bshnjl », « bshnbx » et « bshall » de respectivement 4, 4 et 9 batchs pour les paies à la demande, les paies de correction et explorations, les autre batch :

bshnjl:
  discipline = fcfs
  device = bshnjl1,bshnjl2,bshnjl3,bshnjl4

bshnjl1:
  backend = /usr/bin/ksh
...

bshnjl4:
  backend = /usr/bin/ksh


bshnbx:
  discipline = fcfs
  device = bshnbx1,bshnbx2,bshnbx3,bshnbx4

bshnbx1:
  backend = /usr/bin/ksh
...

bshnbx4:
  backend = /usr/bin/ksh


bshall:
  discipline = fcfs
  device = bshall1,bshall2,bshall3,bshall4
,bshall5,bshall6,bshall7,bshall8,bshall9
bshall1:
  backend = /usr/bin/ksh
...

bshall9:
  backend = /usr/bin/ksh
 

2) Sous HR Access, modifiez le script ${SIGACS}/bin/job.

Exemple ci joint :
- les paies à la demande NJL sont lancées sur la queue bshnjl
- les paies de correction et explorations sur la queue bshnbx
- tous les autre batch sur la queue bshall

...
# Lancement d'un script de $SIGACS/bin
if [ ! "$T" ]
then
  JSCRI=`echo "$PARAM"|cut –c14-21| tr –d ‘ ‘`

  echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1; rm \${0}" > $TMP/OPER.$$.pendingjob
  case ${JSCRI} in
  [A-Z,0-9]*NJL)
 
qprt -Pbshnjl "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
    ;;
  [A-Z,0-9]*NJC|[A-Z,0-9]*NBX)
 
qprt -Pbshnbx "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
    ;;
  *)
 
qprt -Pbshall "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
    ;;
  esac
else
...