linewer 发表于 2017-04-03 18:24

commands.getstatusoutput会不会阻塞不返回

本帖最后由 linewer 于 2017-04-03 18:25 编辑

有个程序片段,使用thread模块产生两个线程,每个用commands.getstatusoutput执行一ssh登陆远程服务执行部分命令并返回执行的结果

现在的问题是程序放到前台没啥问题,但是放到后台执行一段时间发现就stopped住了, 看了下调用堆栈,发现工作线程在read,主线程在wait. 刚开始以为是没加锁的原因,后来看了调用堆栈,感觉是一直没有读到返回结果. 初步定位应该是command模块那个函数的问题, 文档中对这个模块的解释比较少,哪位能解答下么,多谢!

#!/usr/bin/python


import commands
import time
import threading
import logging

result_list = []
cmds = []
cmd1="sshtest1@host1 'sleep 3 && date'"
cmd2="sshtest2@host2 'sleep 3 && date'"
cmds.append(cmd1)
cmds.append(cmd2)

def execfunc(cmd):
   
    global result_list
    logging.debug('starting')
    (status1,output1)=commands.getstatusoutput(cmd)
    result_list.append(output1)
    print output1
    logging.debug('ending')

def testfunc(cmd):
    print cmd

def run():
    threads = []
    global cmds
    for i in cmds:
      t = threading.Thread(target=execfunc,args=(i,))
      #t = threading.Thread(target=testfunc,args=(i,))   //换成这个没有问题
      t.start()
      threads.append(t)
    for i in threads:
      logging.debug('%s-staring',i.getName())
      i.join()
      logging.debug('%s-ending',i.getName())


def main():
    while True:
      global result_list
      result_list = []
      run()
      #do something for result_list

      time.sleep(10)

if __name__ == '__main__':
      main()
主线程堆栈如下:
#00x00007f2688629930 in sem_wait () from /lib64/libpthread.so.0
#10x00007f2688936438 in PyThread_acquire_lock () from /usr/lib64/libpython2.6.so.1.0
#20x00007f268893a324 in ?? () from /usr/lib64/libpython2.6.so.1.0
#30x00007f268890e9e4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#40x00007f2688910657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#50x00007f268890eaa4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#60x00007f2688910657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#70x00007f268890eaa4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#80x00007f268890fb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#90x00007f268890fb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#10 0x00007f2688910657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#11 0x00007f2688910732 in PyEval_EvalCode () from /usr/lib64/libpython2.6.so.1.0
#12 0x00007f268892abac in ?? () from /usr/lib64/libpython2.6.so.1.0
#13 0x00007f268892ac80 in PyRun_FileExFlags () from /usr/lib64/libpython2.6.so.1.0
#14 0x00007f268892c16c in PyRun_SimpleFileExFlags () from /usr/lib64/libpython2.6.so.1.0
#15 0x00007f26889388a2 in Py_Main () from /usr/lib64/libpython2.6.so.1.0
#16 0x00007f2687c1bd5d in __libc_start_main () from /lib64/libc.so.6
#17 0x0000000000400649 in _start ()

工作线程堆栈如下:
00x00007fb082ad54dd in read () from /lib64/libc.so.6
#10x00007fb082a6bce8 in _IO_new_file_underflow () from /lib64/libc.so.6
#20x00007fb082a6ec0d in _IO_default_xsgetn_internal () from /lib64/libc.so.6
#30x00007fb082a61462 in fread () from /lib64/libc.so.6
#40x00007fb083699d2c in ?? () from /usr/lib64/libpython2.6.so.1.0
#50x00007fb08370b9e4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#60x00007fb08370cb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#70x00007fb08370d657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#80x00007fb0836a0dad in ?? () from /usr/lib64/libpython2.6.so.1.0
#90x00007fb083679c63 in PyObject_Call () from /usr/lib64/libpython2.6.so.1.0
#10 0x00007fb08370a470 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#11 0x00007fb08370cb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#12 0x00007fb08370cb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#13 0x00007fb08370d657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#14 0x00007fb0836a0cb0 in ?? () from /usr/lib64/libpython2.6.so.1.0
#15 0x00007fb083679c63 in PyObject_Call () from /usr/lib64/libpython2.6.so.1.0
#16 0x00007fb08368c6af in ?? () from /usr/lib64/libpython2.6.so.1.0
#17 0x00007fb083679c63 in PyObject_Call () from /usr/lib64/libpython2.6.so.1.0
#18 0x00007fb083705c93 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython2.6.so.1.0
#19 0x00007fb0837377ba in ?? () from /usr/lib64/libpython2.6.so.1.0
#20 0x00007fb0834209d1 in start_thread () from /lib64/libpthread.so.0
---Type <return> to continue, or q <return> to quit---
#21 0x00007fb082ae28fd in clone () from /lib64/libc.so.6

页: [1]
查看完整版本: commands.getstatusoutput会不会阻塞不返回