C'est un peu désordonné, mais cela fonctionne comme une solution simple à avoir dans l'historique des commandes. Tous les outils standards. La sortie est à peu près la même que celle que vous obtenez d'un appel qstat normal, mais vous n'obtiendrez pas les en-têtes :
Une ligne :
qstat -xml | tr '\n' ' ' | sed 's#<job_list[^>]*>#\n#g' \
| sed 's#<[^>]*>##g' | grep " " | column -t
Description des commandes :
Répertorier les travaux au format XML :
qstat -xml
Supprimer toutes les nouvelles lignes :
tr '\n' ' '
Ajoutez une nouvelle ligne avant chaque entrée de travail dans la liste :
sed 's#<job_list[^>]*>#\n#g'
Supprimez tous les éléments XML :
sed 's#<[^>]*>##g'
Hack pour ajouter une nouvelle ligne à la fin :
grep " "
Coloniser :
column -t
Exemple de sortie
351996 0.50502 ProjectA_XXXXXXXXX_XXXX_XXXXXX user123 r 2015-06-25T15:38:41 [email protected] 1
351997 0.50502 ProjectA_XXX_XXXX_XXX user123 r 2015-06-25T15:39:26 [email protected] 1
351998 0.50502 ProjectA_XXXXXXXXXXXXX_XXXX_XXXX user123 r 2015-06-25T15:40:26 [email protected] 1
351999 0.50502 ProjectA_XXXXXXXXXXXXXXXXX_XXXX_XXXX user123 r 2015-06-25T15:42:11 [email protected] 1
352001 0.50502 ProjectA_XXXXXXXXXXXXXXXXXXXXXXX_XXXX_XXXX user123 r 2015-06-25T15:42:11 [email protected] 1
352008 0.50501 runXXXX69 usr1 r 2015-06-25T15:49:04 [email protected] 1
352009 0.50501 runXXXX70 usr1 r 2015-06-25T15:49:04 [email protected] 1
352010 0.50501 runXXXX71 usr1 r 2015-06-25T15:49:04 [email protected] 1
352011 0.50501 runXXXX72 usr1 r 2015-06-25T15:49:04 [email protected] 1
352012 0.50501 runXXXX73 usr1 r 2015-06-25T15:49:04 [email protected] 1
352013 0.50501 runXXXX74 usr1 r 2015-06-25T15:49:04 [email protected] 1
Peut-être une solution plus simple :définissez SGE_LONG_JOB_NAMES sur -1, et qstat déterminera la taille de la colonne de nom :
export SGE_LONG_JOB_NAMES=-1
qstat -u username
Fonctionne pour moi.
Santé !
J'écris actuellement mon propre qstat
wrapper afin d'obtenir une sortie propre, utile et personnalisable.
Voici le dépôt github. Le projet a trop grandi pour que le code soit collé dans ce message.
Il est livré avec un programme d'installation et devrait fonctionner sans problème avec Python 2.7 et 3 (le script d'installation effectue les modifications si nécessaire). qjobs -h
fournit une aide sur les options disponibles. Je rédigerai une documentation plus complète dans les jours suivants sur le wiki github.
Je mettrai à jour ce message aussi souvent que possible pour coller à l'état actuel du projet. N'hésitez pas à commenter ici (ou sur github) pour demander des fonctionnalités / signaler des problèmes.
Dans un futur proche, j'essaierai d'ajouter un mode entièrement interactif pour parcourir plus facilement la liste des tâches. Bien entendu, la sortie texte classique sera toujours disponible (il peut être utile d'envoyer la sortie par e-mail ou de vérifier rapidement les tâches en attente/en cours d'exécution).
Exemple de sortie
Commande qjobs
donne :
5599109 short_name r 2015-06-25 10:27:39 queue1
5599110 jobName r 2015-06-25 10:35:39 queue2
5599111 a_long_job_name qw 2015-06-25 10:40:39
5599112 foo qw 2015-06-25 10:40:39
5599113 bar qw 2015-06-25 10:40:39
5599114 baz qw 2015-06-25 10:40:39
5599115 beer qw 2015-06-25 10:40:39
tot: 7
r: 2 qw: 5
Commande qjobs -o
donne :
tot: 7
r: 2 qw: 5
Commande qjobs -o inek -t
donne (e
est le temps écoulé depuis le début/sous-heure, le format est personnalisable à l'aide de la spécification de format. Mini-Langage de Python ; k
est le nom complet de la file d'attente, avec le domaine) :
5598985 SpongeBob 522:02 (21.75 days) [email protected]
5598987 ping_java 521:47 (21.74 days) [email protected]
5598988 run3.14 521:46 (21.74 days) [email protected]
5598990 strange_job_42 521:42 (21.74 days) [email protected]
5598991 coffee-maker 521:39 (21.74 days) [email protected]
5598992 dumbtask 521:29 (21.73 days) [email protected]
qjobs -i
donne une liste complète des 'éléments' disponibles. Chacun de ces articles est disponible en :
- une sortie de colonne (avec
-o ITEMS
); - comme critère pour compter le travail et produit la sortie totale, avec
-t
(par exemple-t s
compter par état comme dans les deux premiers exemples); - comme critère pour trier le travail avec
-s
, la valeur par défaut est-s ips
ce qui signifie que la liste des tâches est triée par ID, puis par priorité et enfin par état avant d'être imprimée.
Le résultat de qjobs -i
est :
i: job id
p: job priority
n: job name
o: job owner
s: job state
t: job start/submission time
e: elapsed time since start/submission
q: queue name without domain
d: queue domain
k: queue name with domain
r: requested queue(s)
l: number of slots used
Ce script fonctionne plutôt bien. On dirait que ça vient de Cambridge. http://www.hep.ph.ic.ac.uk/~dbauer/grid/myqstat.py
Pour Python 3 :
#!/usr/bin/python
import xml.dom.minidom
import os
import sys
import string
f=os.popen('qstat -u \* -xml -r')
dom=xml.dom.minidom.parse(f)
jobs=dom.getElementsByTagName('job_info')
run=jobs[0]
runjobs=run.getElementsByTagName('job_list')
def fakeqstat(joblist):
for r in joblist:
try:
jobname=r.getElementsByTagName('JB_name')[0].childNodes[0].data
jobown=r.getElementsByTagName('JB_owner')[0].childNodes[0].data
jobstate=r.getElementsByTagName('state')[0].childNodes[0].data
jobnum=r.getElementsByTagName('JB_job_number')[0].childNodes[0].data
jobtime='not set'
if(jobstate=='r'):
jobtime=r.getElementsByTagName('JAT_start_time')[0].childNodes[0].data
elif(jobstate=='dt'):
jobtime=r.getElementsByTagName('JAT_start_time')[0].childNodes[0].data
else:
jobtime=r.getElementsByTagName('JB_submission_time')[0].childNodes[0].data
print(jobnum, '\t', jobown.ljust(16), '\t', jobname.ljust(16),'\t', jobstate,'\t',jobtime)
except Exception as e:
print(e)
fakeqstat(runjobs)
Pour Python 2 :
#!/usr/bin/python
import xml.dom.minidom
import os
import sys
import string
#import re
f=os.popen('qstat -u \* -xml -r')
dom=xml.dom.minidom.parse(f)
jobs=dom.getElementsByTagName('job_info')
run=jobs[0]
runjobs=run.getElementsByTagName('job_list')
def fakeqstat(joblist):
for r in joblist:
jobname=r.getElementsByTagName('JB_name')[0].childNodes[0].data
jobown=r.getElementsByTagName('JB_owner')[0].childNodes[0].data
jobstate=r.getElementsByTagName('state')[0].childNodes[0].data
jobnum=r.getElementsByTagName('JB_job_number')[0].childNodes[0].data
jobtime='not set'
if(jobstate=='r'):
jobtime=r.getElementsByTagName('JAT_start_time')[0].childNodes[0].data
elif(jobstate=='dt'):
jobtime=r.getElementsByTagName('JAT_start_time')[0].childNodes[0].data
else:
jobtime=r.getElementsByTagName('JB_submission_time')[0].childNodes[0].data
print jobnum, '\t', jobown.ljust(16), '\t', jobname.ljust(16),'\t', jobstate,'\t',jobtime
fakeqstat(runjobs)