Wrapping prstat on Solaris

Diez B. Roggisch deets at nospam.web.de
Mon Jul 27 15:26:46 EDT 2009


skip at pobox.com schrieb:
> At work we currently use top to monitor ongoing system utilization on our
> Solaris systems.  As time has moved on though, use of top has become
> problematic.  Our admins want us to switch to prstat, Sun's top-like
> command.  It works fine however doesn't emit a timestamp at each display
> interval, so it's essentially impossible looking at a prstat output
> file to determine when the particular "screen" was emitted.
> 
> If figured, "No problem.  I'll just write a little wrapper."  Alas, that is
> proving harder than I thought.  I can run prstat directing output to a file
> and it seems to blast out a block of lines every N seconds, but when run
> from inside a Python script I can't seem to make the damn thing not
> massively buffer its output.  Accordingly, my script doesn't really see the
> output as its emitted, so the timestamp line it prepends to a block of
> output is off.
> 
> I'm currently using subprocess.Popen like so:
> 
>     os.environ["TERM"] = "dumb"
>     cmd = "prstat -c %s" % " ".join(sys.argv[1:])
>     pipe = Popen(cmd, shell=True, bufsize=1, stdout=PIPE).stdout
> 
> I've tried these other variants as well:
> 
>   * prefacing the prstat command with unbuffer (the tcl/expect thingamabob)
> 
>   * explicitly redirect the prstat output to /dev/stdout
> 
>   * setting bufsize to 0
> 
>   * used os.popen instead of Subprocess.Popen
> 
> Nothing seems to help.  I always seem to see about 30 seconds of data at
> once (I'm currently using a 5-second interval and 10 lines of output).  I
> would have expected that prstat would simply flush stdout after each block
> of output.
> 
> Any ideas about how to get prstat to cooperate better?

Use pexpect, which will make the program believe it runs in a terminal, 
and not buffer the output.

Diez



More information about the Python-list mailing list