subprocess hangs on reading stdout

T

Tim Arnold

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
 
M

Minesh Patel

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
 
T

Tim Arnold

Minesh Patel said:
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

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,227
Latest member
Daniella65

Latest Threads

Top