How to get process info from python
Gardner Pomper
gardner at networknow.org
Tue Jun 8 20:03:16 EDT 2004
Nick,
AIX does not seem to support the -o format syntax. What I am using is
"ps -lf" which seems to give me as much information as possible. I also,
optionally, add "-u user" if I need to get all the information for a user,
instead of just for the current tty process tree.
Currently, all I am using is the cmd line, but since there doesn't seem to
be any other way to get the memory information for the process from python,
I will need to start using the SZ column. Here is what I have so far
(hopefully 129 lines of code is not too much to post in the group. If it is,
I apologize)
#!/usr/bin/env python
import string
import commands
import emea
from optparse import OptionParser
#
class ProcessStatus :
def __init__(self,header,status):
self.uid = ''
self.pid = ''
self.ppid = ''
self.priority = ''
self.nice = ''
self.size = ''
self.start = ''
self.time = ''
self.cmd = ''
headings = header.split()
headings.remove('WCHAN')
#
# ----- find the char position of the WCHAN, STIME
# ----- TTY and CMD headings
#
wchan_pos = string.index(header,'WCHAN')
stime_pos = string.index(header,'STIME')
tty_pos = string.index(header,'TTY')
cmd_pos = string.index(header,'CMD',stime_pos)
#
# ----- cut the status line before WCHAN because
# ----- that is often blank
#
n = string.rindex(status,' ',0,wchan_pos)
status1 = status[:n-1]
fields = status1.split()
if string.find(status,'<defunct>') < 0 :
#
# ----- the stime is all the chars between
# ----- STIME and TTY
#
x = string.rindex(status,' ',0,stime_pos)
y = string.rindex(status,' ',stime_pos,tty_pos)
sTime = string.strip(status[x:y])
fields.append( sTime)
#
# ----- the TTY and TIME fields are all the chars
# ----- between TTY and CMD
#
max_pos = cmd_pos + 5
if max_pos > len(status)-1 :
max_pos = len(status) - 1
m = string.rindex(status,':',tty_pos,max_pos)
n = string.index(status,' ',m)
status2 = status[y+1:n].strip()
fields.extend(status2.split())
#
# ----- CMD is the rest of the line
#
status3 = status[n:].strip()
fields.append(status3)
try :
for h,y in map(None,headings,fields) :
if h == 'UID' :
self.uid = y
elif h == 'PID' :
self.pid = y
elif h == 'PPID' :
self.ppid = y
elif h == 'PRI' :
self.priority = y
elif h == 'NI':
self.nice = y
elif h == 'SZ' :
self.size = y
elif h == 'STIME' :
self.start = y
elif h == 'TIME' :
self.time = y
elif h == 'CMD' :
if string.find(status,'<defunct>') >= 0 :
self.cmd = '<defunct>'
else:
self.cmd = y
except Exception, error :
logger = emea.get_logger()
logger.exception(error)
raise Exception(error)
def __str__(self) :
return "UID %s PID %s PPID %s PRI %s NI %s SZ %s STIME %s TIME %s
CMD %s" \
%(self.uid,self.pid,self.ppid,self.priority,self.nice,
self.size,self.start,self.time,self.cmd)
def ps(user=None) :
options = ''
if user == 'all' :
options += ' -e'
elif user != None :
options += ' -u ' + user
cmd = 'ps -lf ' + options
ps_result = commands.getoutput(cmd)
lines = ps_result.splitlines()
psList = []
for l in lines[1:] :
psList.append(ProcessStatus(lines[0],l))
return psList
#
#
# -----
#
if __name__ == "__main__" :
parser = OptionParser()
parser.add_option("", "--user",action="store",dest="user",
help="user to do ps for")
parser.add_option("","--log",action="store",dest="log",
default="emea_auto.log",help="name of log file")
parser.add_option("","--verbose",action="store_true",dest="verbose",
help="verbose mode (for debugging)")
(options,args) = parser.parse_args()
#
# ----- define logging
#
emea.set_logger('process_status',options.log,options.verbose)
psList = ps(options.user)
for p in psList:
print p
> -----Original Message-----
> From: python-list-bounces+gardner=networknow.org at python.org
> [mailto:python-list-bounces+gardner=networknow.org at python.org]On Behalf
> Of Nick Vargish
> Sent: Tuesday, June 08, 2004 10:52 AM
> To: python-list at python.org
> Subject: Re: How to get process info from python
>
>
> "Gardner Pomper" <gardner at networknow.org> writes:
>
> > On a related issue, I was very surprise to see that
> os.loadavg() had been
> > added in version 2.3. This seems just as OS specific as the ps
> functionality
> > I want, so that raised my hopes.
>
> Gardner,
>
> I've had to work with process data in the past, and you're right, a
> module to handle accessing ps data would be quite useful. Just for
> fun, I've started writing something to help. All the systems that I
> use "ps" on support a "-o format" for extracting specific information,
> is this option supported on AIX?[*]
>
> What sort of information do you need from ps? I'll try to work it into
> the module's functionality.
>
> I can't promise when it will be ready, but you seem to be rolling your
> own solution anyway.
>
> Nick
>
> [*] Linux, OS X, and Tru64 (nee DEC Unix nee OSF/1). I don't have
> access to an AIX system right now.
>
> --
> # sigmask || 0.2 || 20030107 || public domain || feed
> this to a python
> print reduce(lambda x,y:x+chr(ord(y)-1),'
> Ojdl!Wbshjti!=obwAcboefstobudi/psh?')
> --
> http://mail.python.org/mailman/listinfo/python-list
More information about the Python-list
mailing list