GNU/Linux >> Tutoriales Linux >  >> Linux

qstat y nombres de trabajos largos

Esto es un poco complicado, pero funciona como una solución simple para tener en el historial de comandos. Todas las herramientas estándar. La salida es más o menos la misma que obtienes de una llamada qstat normal, pero no obtendrás los encabezados:

Una frase:

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

Descripción de los comandos:

Listar trabajos como XML:

qstat -xml

Eliminar todas las líneas nuevas:

tr '\n' ' '

Agregue una nueva línea antes de cada entrada de trabajo en la lista:

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

Eliminar todo el material XML:

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

Hackear para agregar nueva línea al final:

grep " "

Columnizar:

column -t

Ejemplo de salida

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

Tal vez una solución más fácil:establezca SGE_LONG_JOB_NAMES en -1, y qstat calculará el tamaño de la columna de nombre:

export SGE_LONG_JOB_NAMES=-1
qstat -u username

Funciona para mí.

¡Salud!


Actualmente estoy escribiendo mi propio qstat envoltorio para obtener un resultado limpio, útil y personalizable.

Aquí está el repositorio de github. El proyecto ha crecido demasiado como para pegar el código en este mensaje.

Viene con un instalador y debería funcionar sin ningún problema con Python 2.7 y 3 (el script de instalación hace las modificaciones si es necesario). qjobs -h proporciona ayuda sobre las opciones disponibles. Escribiré una documentación más completa en los próximos días en el wiki de github.

Actualizaré este mensaje con la mayor frecuencia posible para mantener el estado actual del proyecto. Siéntase libre de comentar aquí (o en github) para solicitar funciones/informar problemas.

En un futuro cercano, intentaré agregar un modo completamente interactivo para navegar por la lista de trabajos más fácilmente. Por supuesto, la salida de texto clásica seguirá estando disponible (podría ser útil para enviar la salida por correo electrónico o para una revisión rápida de los trabajos pendientes/en ejecución).

Ejemplo de salida

Comando qjobs da:

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

tot: 7

r: 2   qw: 5

Comando qjobs -o inek -t da (e es el tiempo transcurrido desde la hora de inicio/sub, el formato se puede personalizar utilizando las especificaciones de formato. Minilenguaje de Python; k es el nombre completo de la cola, con 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 da una lista completa de los 'elementos' disponibles. Cada uno de estos artículos está disponible como:

  • una salida de columna (con -o ITEMS );
  • como criterio para contar el trabajo y produce una salida total, con -t (por ejemplo, -t s contar por estado como en los dos primeros ejemplos);
  • como criterio para ordenar el trabajo con -s , por defecto es -s ips lo que significa que la lista de trabajos se ordena por ID, luego por prioridad y finalmente por estado antes de imprimirse.

El resultado de qjobs -i es:

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

Este script funciona bastante bien. Parece que es de Cambridge. http://www.hep.ph.ic.ac.uk/~dbauer/grid/myqstat.py

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

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

Linux
  1. Cambiar el nombre de todos los archivos y nombres de directorios a minúsculas en Linux

  2. Tutorial de Programación C 4 - Variables y Memoria

  3. ¿Leer y buscar páginas man largas?

  4. ¿Nombres de usuario y host en la clave pública en Ssh-copy-id?

  5. Comprender los comandos de control de trabajos en Linux:bg, fg y CTRL+Z

Gogo:cree accesos directos a rutas largas y complicadas en Linux

Los mejores terminales Linux en línea y editores Bash en línea

Crear y eliminar un trabajo cron

Cómo evaluar cadenas como números en Bash

Diferencia entre comillas simples y dobles en Bash Shell

¿Cuál es la diferencia entre apt-get y aptitude?