FAQ
Hi, I'm querying a list of network servers for processes belonging to a
specific user. The problem is that when I try to read the stdout from the
subprocess it sometimes hangs. Not always though.

I thought maybe I needed to set unbufferered to true, so at the beginning of
the code I set
os.environ['PYTHONUNBUFFERED'] = '1'
But I think it's more likely the subprocess that needs to be unbuffered.

Here's the bit of code:
---------------------------
for machine_name in self.alive:# a list of servers that responded to
ping already.
cmd = ["/bin/remsh", machine_name, 'ps -flu %s' % uid]
finish = time.time() + 4.0
p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
while p.poll() is None:
time.sleep(0.5)
if finish < time.time():
p.kill()
print 'skipping' # this works ok
break

s = ''
if p:
s = p.stdout.read() # trhis will hang occasionally
if not s:
continue
---------------------------

Any ideas? comments on code welcome also.
thanks,
--Tim Arnold

Search Discussions

  • Minesh Patel at Oct 15, 2009 at 5:10 am
    Any ideas? comments on code welcome also.
    Here's something that I would probably do, there may be better ways.
    This only works on python2.6 for the terminate() method.


    import signal
    import subprocess

    def timeout_handler(signum, frame):
    print "About to kill process"
    p.terminate()

    for machine_name in self.alive:
    cmd = ["/bin/remsh", machine_name, 'ps -flu %s' % uid]
    signal.signal(signal.SIGALRM, timeout_handler)
    signal.alarm(1)
    p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    signal.alarm(0)
    if stdout:
    print stdout
    elif stderr:
    print stderr



    --
    Thanks,
    --Minesh
  • Tim Arnold at Oct 15, 2009 at 4:39 pm
    "Minesh Patel" <minesh at gmail.com> wrote in message
    news:mailman.1408.1255583431.2807.python-list at python.org...
    Any ideas? comments on code welcome also.
    Here's something that I would probably do, there may be better ways.
    This only works on python2.6 for the terminate() method.


    import signal
    import subprocess

    def timeout_handler(signum, frame):
    print "About to kill process"
    p.terminate()

    for machine_name in self.alive:
    cmd = ["/bin/remsh", machine_name, 'ps -flu %s' % uid]
    signal.signal(signal.SIGALRM, timeout_handler)
    signal.alarm(1)
    p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    signal.alarm(0)
    if stdout:
    print stdout
    elif stderr:
    print stderr



    --
    Thanks,
    --Minesh
    Hi Minesh,
    Looks like I need to learn about signals--that code looks nice. I'm using
    python2.6.
    thanks,
    --Tim Arnold

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedOct 14, '09 at 4:45p
activeOct 15, '09 at 4:39p
posts3
users2
websitepython.org

2 users in discussion

Tim Arnold: 2 posts Minesh Patel: 1 post

People

Translate

site design / logo © 2022 Grokbase