Dies ist ein bisschen chaotisch, aber es funktioniert als einfache Lösung im Befehlsverlauf. Alle gängigen Werkzeuge. Die Ausgabe ist so ziemlich die gleiche wie bei einem normalen qstat-Aufruf, aber Sie erhalten keine Header:
Einzeiler:
qstat -xml | tr '\n' ' ' | sed 's#<job_list[^>]*>#\n#g' \
| sed 's#<[^>]*>##g' | grep " " | column -t
Beschreibung der Befehle:
Jobs als XML auflisten:
qstat -xml
Alle Zeilenumbrüche entfernen:
tr '\n' ' '
Fügen Sie vor jedem Job-Eintrag in der Liste einen Zeilenumbruch hinzu:
sed 's#<job_list[^>]*>#\n#g'
Alles XML-Zeug entfernen:
sed 's#<[^>]*>##g'
Hack zum Hinzufügen einer neuen Zeile am Ende:
grep " "
Spalten:
column -t
Beispielausgabe
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
Vielleicht eine einfachere Lösung:Setzen Sie SGE_LONG_JOB_NAMES auf -1, und qstat ermittelt die Größe der Namensspalte:
export SGE_LONG_JOB_NAMES=-1
qstat -u username
Funktioniert bei mir.
Prost!
Ich schreibe gerade mein eigenes qstat
Wrapper, um eine saubere, nützliche und anpassbare Ausgabe zu erhalten.
Hier ist das Github-Repository. Das Projekt ist zu stark gewachsen, als dass der Code in diese Nachricht eingefügt werden könnte.
Es wird mit einem Installationsprogramm geliefert und sollte problemlos mit Python 2.7 und 3 funktionieren (das Installationsskript nimmt die Änderungen bei Bedarf vor). qjobs -h
bietet Hilfestellung zu den verfügbaren Optionen. Ich werde in den nächsten Tagen eine vollständigere Dokumentation im Github-Wiki schreiben.
Ich werde diese Nachricht so oft wie möglich aktualisieren, um am aktuellen Stand des Projekts festzuhalten. Bitte zögern Sie nicht, hier (oder auf github) einen Kommentar abzugeben, um nach Funktionen zu fragen/Probleme zu melden.
In naher Zukunft werde ich versuchen, einen vollständig interaktiven Modus hinzuzufügen, um die Jobliste einfacher zu durchsuchen. Natürlich wird die klassische Textausgabe weiterhin verfügbar sein (es könnte nützlich sein, die Ausgabe per E-Mail zu versenden oder für eine schnelle Überprüfung der anstehenden/laufenden Jobs).
Beispielausgabe
Befehl qjobs
ergibt:
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
Befehl qjobs -o
ergibt:
tot: 7
r: 2 qw: 5
Befehl qjobs -o inek -t
ergibt (e
die verstrichene Zeit seit Start/Unterzeit ist, kann das Format mithilfe der Formatspezifikation angepasst werden. Mini-Sprache von Python; k
ist vollständiger Warteschlangenname mit Domäne):
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
gibt eine vollständige Liste der verfügbaren 'Gegenstände'. Jedes dieser Elemente ist verfügbar als:
- eine Spaltenausgabe (mit
-o ITEMS
); - als Kriterium, um den Job zu zählen und die Gesamtausgabe zu erzeugen, mit
-t
(zB-t s
wie in den beiden ersten Beispielen nach Bundesländern zu zählen); - als Kriterium, um den Job mit
-s
zu sortieren , Standard ist-s ips
Das bedeutet, dass die Jobliste vor dem Drucken nach ID, dann nach Priorität und schließlich nach Status sortiert wird.
Das Ergebnis von qjobs -i
ist:
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
Dieses Skript funktioniert ziemlich gut. Sieht aus wie aus Cambridge. http://www.hep.ph.ic.ac.uk/~dbauer/grid/myqstat.py
Für 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)
Für 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)