New submission from denny <markfile...@126.com>: Hi all
My environment is python 2.4.4 on linux. I am encountering hang of pipe.read() in commands.getstatusoutput for multi-threading code. I have spawned several threads which will call commands.getstatusoutput to run cli. However, pipe.read may hang sometimes. >From lsof, we know some pipe handles are not closed in the parent process, >after the child process is stopped. ;; -------------------------- Reproduce steps -------------------------- Below are reproduce steps. # Create a python script of /tmp/hang.py, whose content is given below. # Run "service crond stop; python /tmp/hang.py" several times. # The script may probably hang. From lsof of main.py and crond service, we may find one pipe existing in both processes. # If we stop crond to close the pipe, the hang of hang.py will be resolved. ;; -------------------------- Code of hang.py -------------------------- #!/usr/bin/python import commands import datetime import time import os import thread import threading def thread_run1(): cmd = "hostname" print "begin to run command:%s" % (cmd) status, output = commands.getstatusoutput(cmd) print "pid:%d, name:%s, status:%d, output:%s" % \ (os.getpid(), threading.currentThread().getName(), status, output) cmd = "ifconfig eth0" print "begin to run command:%s" % (cmd) status, output = commands.getstatusoutput(cmd) print "pid:%d, name:%s, status:%d, output:%s" % \ (os.getpid(), threading.currentThread().getName(), status, output) cmd = "ifconfig eth1" print "begin to run command:%s" % (cmd) status, output = commands.getstatusoutput(cmd) print "pid:%d, name:%s, status:%d, output:%s" % \ (os.getpid(), threading.currentThread().getName(), status, output) # cmd = "sh /tmp/subprocess.sh" cmd = "echo here1; sleep 2; echo here2; sleep 5" print "begin to run command:%s" % (cmd) status, output = commands.getstatusoutput(cmd) print "pid:%d, name:%s, status:%d, output:%s" % \ (os.getpid(), threading.currentThread().getName(), status, output) def thread_run2(): cmd = "service crond start" print "begin to run command:%s" % (cmd) status, output = commands.getstatusoutput(cmd) print "pid:%d, name:%s, status:%d, output:%s" % \ (os.getpid(), threading.currentThread().getName(), status, output) if __name__=='__main__': print "main function begins." thread_list = [] for i in xrange(1, 10): my_thread = threading.Thread(target = thread_run1) thread_list.append(my_thread) my_thread = threading.Thread(target = thread_run2) thread_list.append(my_thread) for t in thread_list: t.start() time.sleep(10) for t in thread_list: t.join() print "main function ends." ---------- components: Library (Lib) messages: 113086 nosy: denny priority: normal severity: normal status: open title: pipe.read hang, when calling commands.getstatusoutput in multi-threading code of python 2.4 type: behavior versions: 3rd party _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue9532> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com