source: trunk/pbs_swig/distro/examples/pbsmon.py @ 63

Last change on this file since 63 was 63, checked in by bas, 20 years ago

Deleted obsolete directories:

  • 2.1
  • dist
  • 1.5

Added:

  • Walters rack_pbsmon.py
  • Changed pbsmon.py
  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1#!/usr/bin/env python
2#
3# Author: Bas van der Vlies <basv@sara.nl>
4# Date  : 17 Aug 2001
5# Desc. : This script displays the status of the PBS batch.
6#         It display the status of a node. The ideas are
7#         based on the awk-script of Willem Vermin
8#
9# CVS info:
10# $Id: pbsmon.py 63 2004-10-21 12:11:30Z bas $
11#
12import sys
13import string
14import re
15
16import pbs
17
18pbs_ND_free_and_job = 'not_all_procs_used'
19
20translate_state = {
21    pbs.ND_free             : '_',
22    pbs.ND_down             : 'X',
23    pbs.ND_offline          : '.',
24    pbs.ND_reserve          : 'R',
25    pbs.ND_job_exclusive    : 'J',
26    pbs.ND_job_sharing      : 'S',
27    pbs.ND_busy             : '*',
28    pbs.ND_state_unknown    : '?',   
29    pbs.ND_timeshared       : 'T',
30    pbs.ND_cluster          : 'C',
31    pbs_ND_free_and_job     : 'j'
32}
33
34
35
36def display_cluster_status(nl, sl):
37
38  # Thanks to Daniel Olson, we have now code that can handle
39  # 2 and 3 digit hostname numbers
40  #
41  if len(nl) == 1: 
42    print nl[0]
43    width = len( nl[0] )
44  else:
45    print nl[0]
46    width = len( nl[1] )
47
48  # Determine what format we have to use
49  #
50  if width == 3:
51    step = end = 19
52    format = '%3s'
53  else:
54    step  = end = 25
55    format = '%2s'
56
57  start = 0 
58
59  items = len(nl)
60
61  # Sanity check
62  if end > items:
63    end = items
64
65  while start < items:
66
67    print ' ',
68    for j in range(start,end):
69      print format %(nl[j]) ,
70
71    print '\n ',
72    for j in range(start,end):
73      print format %(sl[j]) ,
74   
75    print '\n'
76
77    start = end
78    end = end + step
79
80    if end > items:
81      end = items
82   
83  # Now some statistics
84  #
85  n = 0
86  for key in translate_state.keys():
87    value = translate_state[key]
88    print "%3s %-21s : %d\t |" %( value, key, sl.count(value) ),
89    if n%2:
90      print ''
91    n = n + 1
92
93def main():
94  state_list = []
95  node_list  = []
96  node_nr    = 0
97
98  if len(sys.argv) > 1:
99    pbs_server = sys.argv[1]
100  else:
101    pbs_server = pbs.pbs_default()
102    if not pbs_server:
103      print "No default pbs server, usage: pbsmon [server] "
104      sys.exit(1)
105
106  con = pbs.pbs_connect(pbs_server)
107  if con < 0:
108   print  pbs.pbs_geterrmsg(con)
109   sys.exit(1)
110
111  # We are only interested in the state and jobs of a node
112  #
113  attrl = pbs.new_attrl(2);
114  attrl[0].name='state'
115  attrl[1].name = 'jobs'
116
117
118  nodes = pbs.pbs_statnode(con, "", attrl, "NULL")
119
120  # Some is het None dan weer NULL, beats me
121  #
122  for node in nodes:
123
124    # display_node_status(batch_info)
125    node_attr = node.attribs
126
127    # A node can have serveral states, huh. We are only
128    # interested in first entry.
129    #
130    temp = string.splitfields(node_attr[0].value, ',')
131    state = temp[0]
132    state_list.append(translate_state[state])
133
134    # look if on a free node a job is scheduled
135    #
136    if state == pbs.ND_free:
137       if len(node_attr) > 1:
138          state_list.append(translate_state[pbs_ND_free_and_job])
139       else:
140          state_list.append(translate_state[state])
141    else:
142          state_list.append(translate_state[state])
143               
144               
145    re_host = re.compile(r"""
146
147      (?P<name>\d+)
148
149      """, re.VERBOSE)
150
151    result = re_host.search(node.name)
152    result = None
153    if result:
154      print 'bas'
155      node_list.append( result.group('name') )
156    else:
157      node_nr = node_nr + 1
158      node_list.append( node_nr )
159
160  display_cluster_status(node_list, state_list)
161
162main()
Note: See TracBrowser for help on using the repository browser.