Août 30 2016
Lister les JOBQ des Profils Utilisateur 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