2014-09-29 9 views
22

Wie bekomme ich qstat, um mir volle Job-Namen zu geben?Qstat und lange Job-Namen

Ich weiß, qstat -r gibt detaillierte Informationen über die Aufgabe, aber es ist zu viel und die Ressourcenanforderungen sind enthalten.

Der qstat -r Ausgang ist wie:

131806 0.25001 tumor_foca ajalali  qw 09/29/2014 15:49:41         1 2-100:1 
     Full jobname:  tumor_focality-TCGA-THCA-ratboost_linear_svc 
     Hard Resources: distribution=wheezy (0.000000) 
         h_rt=72000 (0.000000) 
         mem_free=15G (0.000000) 
         h_vmem=15G (0.000000) 
         h_stack=256M (0.000000) 
     Soft Resources: 
131807 0.25001 vital_stat ajalali  qw 09/29/2014 15:49:41         1 2-100:1 
     Full jobname:  vital_status-TCGA-LGG-ratboost_linear_svc 
     Hard Resources: distribution=wheezy (0.000000) 
         h_rt=72000 (0.000000) 
         mem_free=15G (0.000000) 
         h_vmem=15G (0.000000) 
         h_stack=256M (0.000000) 
     Soft Resources: 

Gerade jetzt meine einzige Option grep ist der Ausgang als ich brauche:

$ qstat -r | grep "Full jobname" -B1 
-- 
131806 0.25001 tumor_foca ajalali  qw 09/29/2014 15:49:41         1 2-100:1 
     Full jobname:  tumor_focality-TCGA-THCA-ratboost_linear_svc 
-- 
131807 0.25001 vital_stat ajalali  qw 09/29/2014 15:49:41         1 2-100:1 
     Full jobname:  vital_status-TCGA-LGG-ratboost_linear_svc 

Kann ich es besser, einen schöneren Ausgang haben?

+0

Um die vollständigen Jobnamen aller aktuellen Jobs eines bestimmten Benutzers zu erhalten: 'qstat -f | grep -C 1 username @ ' Sie können weitere Informationen mit' -C 2 ', '-C 3' usw. erhalten. –

Antwort

22

Dies ist ein bisschen chaotisch, aber es funktioniert als eine einfache Lösung in der Befehlsgeschichte zu haben. Alle Standardwerkzeuge.Die Ausgabe ist so ziemlich das gleiche wie das, was man von einem normalen qstat Anruf erhalten, aber Sie werden nicht die Header erhalten:

One-Liner:

qstat -xml | tr '\n' ' ' | sed 's#<job_list[^>]*>#\n#g' \ 
    | sed 's#<[^>]*>##g' | grep " " | column -t 

Beschreibung der Befehle:

Liste Jobs als XML:

qstat -xml 

entfernen Sie alle Zeilenumbrüche:

tr '\n' ' ' 

Add Newline vor jedem Job Eintrag in der Liste:

sed 's#<job_list[^>]*>#\n#g' 

alle XML Material entfernen:

sed 's#<[^>]*>##g' 

Hack Newline am Ende hinzuzufügen:

grep " " 

Säule:

column -t 

Beispiel Ausgabe

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 
+0

Es funktioniert, aber es ist schlecht formatiert und hat eine Reihe von zusätzlichen Leerzeichen und neue Zeilen. Es wäre schön, wenn Sie sie reparieren und eine Beispielausgabe geben könnten. – adrin

+0

Das war seltsam. Ich habe eine Beispielausgabe hinzugefügt, ich habe hier keine zusätzlichen Leerzeichen und Zeilenumbrüche.Aber wenn Ihr Terminal-Fenster nicht breit genug ist, wird es in eine neue Zeile umgewandelt, da der Wunsch (wie ich es verstanden habe) war, die Job-Namen nicht zu beschneiden. Könnte es sein, dass die Lösung ein wenig zerbrechlich ist und auf anderen Nix-Distributionen nicht so gut funktioniert? (Ich habe SGE 8.1.4 und CentOS 5.11 und 6.6, Bash 3.2, Zsh 5.0.5) – mabahj

+1

Große Antwort! Das Erstellen eines Alias ​​erfordert ein wenig Aufwand, um Anführungszeichen zu umgehen, also poste ich ihn hier: 'alias detqstat = 'qstat -xml | tr '' '' '' \ n '' '' '' '' '' '' '' '| sed '"'" s # ] *> # \ n # g '"'" '| sed '' '' 's # <[^>] *> ## g' "'"' | grep "" | Spalte -t'' –

6

Dieses Skript funktioniert ziemlich gut. Es sieht so aus, als wäre es von 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) 
+1

Danke. Ich habe den kopierten Code in python3 geändert. Es funktioniert jetzt. – adrin

+0

@PhysicalChemist 'os.popen' wird in Zukunft ersetzt, aber ich kann Ihre Lösung nicht mit' subprocess.Popen' arbeiten lassen: Weißt du warum? – tflutre

0

Für mich ist das Skript für Physikalischen Chemiker hat nicht funktioniert, so schrieb ich ein sehr einfaches Skript Das xml.tree.ElementTree Modul, das ich als etwas einfacher als xml.dom.minidom

betrachten
import os 
import xml.etree.ElementTree as ET 
f = os.popen('qstat -x') 
tree = ET.parse(f) 
root = tree.getroot() 
print "Job_Id walltime state  nodes  Job_Name" 
print "------ -------- ----- --------------- --------------------------" 
for job in root: 
    print job.find('Job_Id').text, " ", 
    print job.find('resources_used').find('walltime').text, " ", 
    print job.find('job_state').text, " ", 
    print job.find('Resource_List').find('nodes').text, " ", 
    print job.find('Job_Name').text 
3

ich zur Zeit meine eigenen qstat Wrapper um schriebe eine saubere, nützliche und anpassbare Ausgabe zu erhalten.

Hier ist die github repository. Das Projekt ist zu stark gewachsen, damit der Code in diese Nachricht eingefügt werden kann.

Es kommt mit einem Installer und sollte ohne Probleme mit Python 2.7 und 3 (das Installationsskript macht die Änderungen, wenn nötig) funktionieren. qjobs -h bietet einige Hilfe zu den verfügbaren Optionen. Ich werde in den nächsten Tagen eine ausführlichere Dokumentation auf dem GitHub Wiki schreiben.

Ich werde diese Nachricht so oft wie möglich aktualisieren, um den aktuellen Status des Projekts beizubehalten. Bitte zögern Sie nicht, hier (oder auf github) zu kommentieren, um nach Features/Berichtsproblemen zu fragen.

In naher Zukunft werde ich versuchen, einen vollständig interaktiven Modus hinzuzufügen, um die Jobliste einfacher zu durchsuchen. Natürlich ist die klassische Textausgabe weiterhin verfügbar (es könnte nützlich sein, die Ausgabe per E-Mail zu versenden oder eine schnelle Überprüfung der ausstehenden/laufenden Jobs durchzuführen).

Beispiel Ausgabe

Befehl qjobs gibt:

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 gibt:

tot: 7 

r: 2 qw: 5 

Befehl qjobs -o inek -t gibt (e Zeit seit dem Start/sub Zeit abgelaufen ist, ist das Format anpassbar mit der Format Spec. Mini-Language von Python; k ist vollständige Warteschlangennamen, mit Domain):

5598985 SpongeBob  522:02 (21.75 days) [email protected] 
5598987 ping_java  521:47 (21.74 days) [email protected]e 
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 'Artikel'. Jeder dieser Artikel ist verfügbar als:

  • eine Spaltenausgabe (mit -o ITEMS);
  • als ein Kriterium, um den Job zu zählen und eine Gesamtausgabe zu erzeugen, mit -t (z. B. -t s, um nach Zustand zu zählen, wie in den zwei ersten Beispielen);
  • als ein Kriterium zum Sortieren des Jobs mit -s, Standard ist -s ips, was bedeutet, dass die Jobliste nach ID, dann nach Priorität und schließlich nach Status vor dem Drucken sortiert wird.

Das Ergebnis 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 
0

Dank JLT für schönen einfachen Code. Ich habe es etwas erweitert, um meine Bedürfnisse zu erfüllen und es schön aussehen zu lassen.

Beispielausgabe:

Job ID    Job Name     Owner Status 
------ ------------------------------------ ------ ------ 
201716 AtacSilN100400K      mtsige R  
201771 IsoOnGrap400K       mtsige R  
202067 AtacOnSilica400K      mtsige R  
202100 AtacGrapN100400K      mtsige R  
202135 AtacOnSilc400K      mtsige R  
202145 AtacOnGrap400K      mtsige R  
202152 AtacOnGraphN3360K      mtsige R  
202161 AtacticSilicaN10      mtsige R  
202163 AtacGrapN10       mtsige R  
202169 AtacSilcN10       mtsige R  
202192 wallpmma07       am110 R  
202193 wallpmma03       am110 R  
202194 att03wpm_95solps      am110 R  
202202 AtacticSilicaN3      mtsige R  
203260 8test18_trop_2p      ico  R  
203359 parseAll_Bob/Sub951By50/Cyl20A_atom1 oge1 R  
203360 parseAll_Bob/Sub951By50/Cyl30A_atom1 oge1 R  
203361 parseAll_Bob/Sub951By50/Cyl30A_atom2 oge1 R  

Code:

#!/opt/bin/python3 
import os 
import xml.etree.ElementTree as ET 

#Fields 
fields=['Job_Id','Job_Name','Job_Owner','job_state'] 
names=['Job ID','Job Name','Owner','Status'] 

#Get job info 
f = os.popen('qstat -x') 
tree = ET.parse(f) 
root = tree.getroot() 
n_fields=len(fields) 
jobs=[[job.find(field).text for field in fields] for job in root] 
max_lengths=[len(name) for name in names] 
sep=' ' 

#Identify max characer length per field 
for j in jobs: 
    for i in range(n_fields): 
      #Chop off anything after and including '@' or '.' from all fields 
      if j[i].find('@')>0: 
        j[i]=j[i][:j[i].find('@')] 
      if j[i].find('.')>0: 
        j[i]=j[i][:j[i].find('.')] 
      if(len(j[i])>max_lengths[i]): 
        max_lengths[i]=len(j[i]) 

#Field names 
for i in range(n_fields): 
    print('{s:^{length}}'.format(s=names[i],length=max_lengths[i]),end=sep) 
print() 

#Dashes 
for i in range(n_fields): 
    print('-'*max_lengths[i],end=sep) 
print() 

#Jobs 
for j in jobs: 
    for i in range(n_fields): 
      if j[i].find('@')>0: 
        j[i]=j[i][:j[i].find('@')] 
      print('{s:<{length}}'.format(s=j[i],length=max_lengths[i]),end=sep) 
    print() 
0

Eine schlechte KISS Lösung:

qstat -xml -f -u \* | fgrep JB_name | wc -l 
0

Vielleicht eine einfachere Lösung: set SGE_LONG_JOB_NAMES auf -1 und qstat wird Abbildung aus der Größe der Spalte Name:

export SGE_LONG_JOB_NAMES=-1 
qstat -u username 

Funktioniert für mich.

Prost!