web-dev-qa-db-ja.com

qstatおよび長いジョブ名

qstatを取得して完全なジョブ名を取得するにはどうすればよいですか?

知っている qstat -rは、タスクに関する詳細情報を提供しますが、多すぎるため、リソース要件が含まれています。

qstat -r出力は次のようになります。

 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:   

現在、私の唯一のオプションは、必要に応じてgrepを出力することです。

$ 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

より良い出力を得るためにもっと良いことはできますか?

36
adrin

これは少し面倒ですが、コマンド履歴に含める簡単な解決策として機能します。すべての標準ツール。出力は通常のqstat呼び出しから得られるものとほとんど同じですが、ヘッダーは取得できません。

ワンライナー:

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

コマンドの説明:

ジョブをXMLとしてリストします。

qstat -xml

すべての改行を削除します。

tr '\n' ' '

リスト内の各ジョブエントリの前に改行を追加します。

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

すべてのXMLを削除します。

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

最後に改行を追加するハック:

grep " "

列化:

column -t

出力例

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
36
mabahj

このスクリプトはかなりうまく機能します。ケンブリッジから来たようです。 http://www.hep.ph.ic.ac.uk/~dbauer/grid/myqstat.py

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

For 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)
8
PhysicalChemist

たぶん簡単な解決策:SGE_LONG_JOB_NAMESを-1に設定すると、qstatは名前列のサイズを計算します。

export SGE_LONG_JOB_NAMES=-1
qstat -u username

私のために働く。

乾杯!

4

現在、きれいで便利でカスタマイズ可能な出力を取得するために、独自のqstatラッパーを作成しています。

githubリポジトリ です。このメッセージにコードを貼り付けるには、プロジェクトが大きくなりすぎています。

インストーラーが付属しており、Python 2.7と3(必要に応じてインストールスクリプトが変更を行います))の両方で問題なく動作するはずです。qjobs -hは利用可能なオプションに関するヘルプを提供します。 github wikiで、次の数日でより完全なドキュメントを作成します。

このメッセージを可能な限り頻繁に更新して、プロジェクトの現在の状態を維持します。機能/レポートの問題については、ここ(またはGitHub)でコメントしてください。

近い将来、完全にインタラクティブなモードを追加して、ジョブリストをより簡単に閲覧できるようにしようと思います。もちろん、従来のテキスト出力は引き続き使用できます(出力を電子メールで送信したり、保留中または実行中のジョブをすばやく確認したりするのに役立ちます)。

出力例

コマンドqjobsは以下を提供します:

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

コマンドqjobs -oは以下を提供します:

tot: 7

r: 2   qw: 5

コマンドqjobs -o inek -tは(eは開始/サブ時間からの経過時間です。フォーマットはPythonの Format Spec。Mini-Language を使用してカスタマイズできます; kはドメインを含む完全なキュー名です):

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は、利用可能な「アイテム」の完全なリストを提供します。このアイテムはそれぞれ次のように利用できます。

  • 列出力(-o ITEMSを使用);
  • ジョブをカウントし、-tを使用して合計出力を生成する基準として(例:最初の2つの例のように、状態ごとにカウントする-t s)。
  • -sでジョブをソートする基準として、デフォルトは-s ipsです。これは、ジョブリストがID、優先度、最後に印刷前の状態でソートされることを意味します。

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
3
Adrien

ニースのシンプルなコードを提供してくれたJLTに感謝します。ニーズに合わせて少し拡張し、見た目を良くしました。

サンプル出力:

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      

コード:

#!/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()
1
Oliver Evans

私にとって物理化学者のスクリプトは機能しなかったので、 xml.tree.ElementTree モジュールを使用して非常に簡単なスクリプトを作成しました。より xml.dom.minidom

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

貧しいKISSソリューション:

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

pythonコード

import xmltodict
import subprocess as sp
import pandas as pd

qstat_xml = sp.check_output(['qstat','--xml'], stderr=sp.STDOUT)  # read xml
stat_dict = xmltodict.parse(qstat_xml) # convert to dict
job_list = stat_dict['Data']['Job'] # select job_list
job_df = pd.DataFrame(job_list) # convert to dataframe
print('columns', job_df.columns) # print available columns
column_list = ['Job_Id', 'Job_Name']
selection_df = job_df[column_list]  # select columns
print(selection_df)
0
H.Kloosterman