Août 30 2016

Lister les JOBQ des Profils Utilisateur AS400

Publié par à 6:44 sous AS400

Je veux faire un peu de ménage sur notre IBM i principal à commencer par les files de travaux (JOBQ) dans lesquelles s’exécutent les travaux des utilisateurs. La plupart des utilisateurs ont leur propre JOBD, ce qui ne devrait pas être. La JOBQ des utilisateurs est définie dans leur JOBD (Job Description). Une JOBD référence une JOBQ et peut être affectée à autant d’utilisateurs que souhaité. La première chose dont j’ai besoin est la liste des JOBQ de tous les utilisateurs.

Je peux récupérer facilement les descriptions de travail avec la commande WRKUSRPRF mais récupérer toutes les files d’attente est un peu plus délicat.
Mais en se connectant à PASE, on y parvient facilement. On peut même affecter des nouvelles JOBD à des profils en se basant sur des critères définis.


Liste JOBD/JOBQ par Profil Utilisateur

Connectez-vous à l’environnement PASE soit en exécutant ‘CALL QP2TERM’ ou en SSH si le service a été activé.
Copiez le code shell suivant dans un fichier (appelons-le listJobq.sh) dans l’IFS, dans votre répertoire maison par exemple, rendez-le exécutable
chmod +x listJobq.sh

et lancez:
./listJobq.sh

#!/QOpenSys/usr/bin/ksh

IFS='
'
# Assurez-vous que la librairie ADMIN existe
system "DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) OUTFILE(ADMIN/USERLIST)"

printf "%11s%11s%11s\n" "USRPRF" "JOBD" "JOBQ"

for i in $(db2 "select upuprf,upjbds from ADMIN.USERLIST" | \
      sed -e '1,3 d' -e '/^$/ d' | sed -e '$ d'); do
  unset IFS
  set -A user $i
  jobq=`system -i "DSPJOBD JOBD(${user[1]})" | awk '/^ Fi/ {print $NF;exit;}'`
  printf "%11s%11s%11s\n" "${user[0]}" "${user[1]}" "$jobq"
done


Cela génère une liste de USRPRF / JOBD / JOBQ. La plupart des profils utilisent la JOBD DEFAULT qui envoie les travaux des utilisateurs dans la JOBQ QBATCH si l’utilisateur ne la change pas au lancement du job.

     USRPRF       JOBD       JOBQ
  ABERTRAND    DEFAULT     QBATCH
  GBOUBOURS    DEFAULT     QBATCH
    IBURNET         IT      QPGMR
   PBUISSON    DEFAULT     QBATCH
    PMARTIN    DEFAULT     QBATCH
        ...        ...        ...

 
Le système pourrait retourner un message « db2: cannot execute » ou « /usr/bin/db2: Permission denied ». Dans ce cas, créez un lien symbolique comme ceci:
ln -s /QOpenSys/usr/bin/qsh /QOpenSys/usr/bin/db2
La raison est détaillée dans cette explication.


Script Bash Optimisé sur PASE

Un inconvénient est la lenteur de la commande « system ». L’option -i la rend un peu plus rapide mais on peut améliorer un peu. Si vous avez installé le paquet OPS (Open Source) d’IBM avec les PTF correspondantes et bash, vous pouvez essayer cette version optimisée avec tables de hachage en bash. Les packages opensource peuvent dorénavant se gérer graphiquement via le client ACS.
On stocke les jobd/jobq dans une table de hachage qui agit comme un cache puisque les descriptions de travail retournent toujours les mêmes JOBQ. Si beaucoup d’utilisateurs ont la même JOBD, ca peut être très efficace (35 fois plus rapide dans mon cas). Ainsi, cette astuce permet d’obtenir de meilleures performances sur les shells scripts qui peuvent être lents sur IBM i comparés à leurs homologues x86.
 

#!/usr/bin/bash

IFS='
'
declare -A JOBQ

# Assurez-vous que la librairie ADMIN existe
system "DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) OUTFILE(ADMIN/USERLIST)"

printf "%11s%11s%11s\n" "USRPRF" "JOBD" "JOBQ"

for i in $(db2 "select upuprf,upjbds from ADMIN.USERLIST" | \
      sed -e '1,3 d' -e '/^$/ d' | sed -e '$ d'); do
  unset IFS
  # Assigne utilisateur et jobd dans user[0] et user[1]
  user=($i)
  # Ajoute la jobq à la table de hachage
  if [ -z ${JOBQ[${user[1]}]} ]; then
    jobq=`system -i "DSPJOBD JOBD(${user[1]})" | awk '/^ Fi/ {print $NF;exit;}'`
    JOBQ[${user[1]}]=$jobq
  fi
  printf "%11s%11s%11s\n" "${user[0]}" "${user[1]}" "${JOBQ[${user[1]}]}"
done

No responses yet

Comments RSS

Leave a Reply