2014-09-29 13 views
22

Come posso ottenere qstat per assegnarmi nomi di lavoro completi?qstat e nomi di lavori lunghi

Lo so qstat -r fornisce informazioni dettagliate sull'attività, ma è troppo e i requisiti delle risorse sono inclusi.

L'qstat -r stampa ricorda:

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: 

In questo momento la mia unica opzione è quella di grep l'uscita come ho bisogno:

$ 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 

Posso farlo meglio per avere un output più bello?

+0

Per ottenere i nomi completi dei lavori di tutti i lavori effettivi di un determinato utente: 'qstat -f | grep -C 1 username @ ' Puoi ottenere maggiori informazioni con' -C 2', '-C 3', ecc. –

risposta

22

Questo è un po 'disordinato, ma funziona come una soluzione semplice da avere nella cronologia dei comandi. Tutti gli strumenti standard.L'uscita è più o meno lo stesso di quello che si ottiene da una normale chiamata qstat, ma non sarà possibile ottenere le intestazioni:

One-liner:

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

Descrizione dei comandi:

lavori lista come XML:

qstat -xml 

Rimuovere tutti i ritorni a capo:

tr '\n' ' ' 

Add a capo prima di ogni entrata lavoro nell'elenco:

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

Rimuovere tutta roba XML:

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

Hack per aggiungere nuova riga alla fine:

grep " " 

Columnize:

column -t 

uscita Esempio

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

Funziona, ma è formattato male, e ha un sacco di extra spazi bianchi e nuove linee. Sarebbe bello se potessi correggerli e dare un esempio di output. – adrin

+0

Era strano. Ho aggiunto un output di esempio, qui non ho spazi bianchi e righe aggiuntive.Ma se la tua finestra di terminale non è abbastanza ampia, allora si avvolgerà in una nuova riga dal momento che il desiderio (come ho capito) era quello di non troncare i nomi del lavoro. Potrebbe essere che la soluzione sia un po 'fragile e non funzioni altrettanto bene su altre versioni di nix distro/sge? (Ho SGE 8.1.4 e CentOS 5.11 e 6.6, bash 3.2, zsh 5.0.5) – mabahj

+1

Ottima risposta! La creazione di un alias richiede un certo sforzo per sfuggire alle virgolette, quindi la posta qui: 'alias detqstat = 'qstat -xml | tr '"'" '\ n' "'"' '"' '' '"' '' '| sed "" "" s # ] *> # \ n # g '"'" '| sed "" "" s # <[^>] *> ## g '"'" '| grep "" | colonna -t'' –

6

Questo script funziona piuttosto bene. Sembra che provenga da Cambridge. http://www.hep.ph.ic.ac.uk/~dbauer/grid/myqstat.py

Per 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) 

Per 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

Grazie. Ho cambiato la tua copia/codice incollato per supportare python3. Ora funziona. – adrin

+0

@PhysicalChemist 'os.popen' sarà sostituito in futuro, ma non riesco a far funzionare la soluzione con' subprocess.Popen': sai perché? – tflutre

0

Per me la sceneggiatura del chimico fisica non funzionava, così ho scritto una sceneggiatura molto semplice utilizzando il modulo xml.tree.ElementTree che considero un po 'più semplice di xml.dom.minidom

3

Attualmente sto scrivendo la mia qstat involucro al fine di ottenere una produzione pulita, utile e personalizzabile.

Ecco lo github repository. Il progetto è cresciuto troppo per il codice da incollare in questo messaggio.

Viene fornito con un programma di installazione e dovrebbe funzionare senza problemi con entrambi i Python 2.7 e 3 (lo script di installazione apporta le modifiche se necessario). qjobs -h fornisce un aiuto sulle opzioni disponibili. Scriverò una documentazione più completa nei seguenti giorni sul wiki di github.

aggiornerò questo messaggio il più spesso possibile per rispettare lo stato attuale del progetto. Non esitate a commentare qui (o su github) per chiedere funzionalità/segnalare problemi.

Nel prossimo futuro, cercherò di aggiungere una modalità completamente interattiva per sfogliare più facilmente l'elenco dei lavori. Ovviamente, il classico output di testo sarà ancora disponibile (potrebbe essere utile inviare un'e-mail all'output o per una rapida verifica dei lavori in sospeso/in esecuzione).

uscita Esempio

Comando qjobs dà:

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 

Comando qjobs -o dà:

tot: 7 

r: 2 qw: 5 

Comando qjobs -o inek -t dà (e è il tempo trascorso da quando/ora di inizio sub, il formato è personalizzabile usando il Format Spec. Mini-Language di Python; k è completo nome della coda, con il dominio):

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 fornisce un elenco completo delle 'voci' disponibili. Ciascun articolo è disponibile come:

  • un'uscita di colonna (con -o ITEMS);
  • come criterio per contare il lavoro e produce l'output totale, con (ad esempio -t s da contare per stato come nei primi due esempi);
  • come criterio per ordinare il lavoro con -s, il valore predefinito è -s ips che significa che l'elenco dei lavori è ordinato per ID, quindi per priorità e infine per stato prima di essere stampato.

Il risultato di qjobs -i è:

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

Grazie a JLT per gentile codice semplice. L'ho ampliato un po 'per adattarlo alle mie esigenze e renderlo bello.

uscita

Esempio:

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  

Codice:

#!/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

Una soluzione BACIO poveri:

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

Forse una soluzione più facile: impostare SGE_LONG_JOB_NAMES a -1, e qstat sarà capire la dimensione della colonna del nome:

export SGE_LONG_JOB_NAMES=-1 
qstat -u username 

Lavori per me.

Cheers!