GNU/Linux >> Tutoriels Linux >  >> Linux

qstat et noms de travail longs

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)

Linux
  1. Comprendre les commandes de contrôle des tâches sous Linux - bg, fg et CTRL + Z

  2. Quels caractères sont interdits dans les noms de répertoires Windows et Linux ?

  3. AWK et les noms de fichiers contenant de l'espace.

  4. syntaxe de ls --hide=et ls --ignore=

  5. commande traceroute :remplacement ou alternative

Gogo - Créer des raccourcis vers des chemins longs et compliqués sous Linux

Tutoriel de programmation en C 4 - Variables et mémoire

Meilleurs terminaux Linux en ligne et éditeurs Bash en ligne

Créer et supprimer une tâche Cron

Différence entre les guillemets simples et doubles dans Bash Shell

Noms des disques ATA et SATA sous Linux