- 论坛徽章:
- 0
|
本帖最后由 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="ssh test1@host1 'sleep 3 && date'"
- cmd2="ssh test2@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()
复制代码- 主线程堆栈如下:
- #0 0x00007f2688629930 in sem_wait () from /lib64/libpthread.so.0
- #1 0x00007f2688936438 in PyThread_acquire_lock () from /usr/lib64/libpython2.6.so.1.0
- #2 0x00007f268893a324 in ?? () from /usr/lib64/libpython2.6.so.1.0
- #3 0x00007f268890e9e4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #4 0x00007f2688910657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
- #5 0x00007f268890eaa4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #6 0x00007f2688910657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
- #7 0x00007f268890eaa4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #8 0x00007f268890fb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #9 0x00007f268890fb8f 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 ()
- 工作线程堆栈如下:
- 0 0x00007fb082ad54dd in read () from /lib64/libc.so.6
- #1 0x00007fb082a6bce8 in _IO_new_file_underflow () from /lib64/libc.so.6
- #2 0x00007fb082a6ec0d in _IO_default_xsgetn_internal () from /lib64/libc.so.6
- #3 0x00007fb082a61462 in fread () from /lib64/libc.so.6
- #4 0x00007fb083699d2c in ?? () from /usr/lib64/libpython2.6.so.1.0
- #5 0x00007fb08370b9e4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #6 0x00007fb08370cb8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
- #7 0x00007fb08370d657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
- #8 0x00007fb0836a0dad in ?? () from /usr/lib64/libpython2.6.so.1.0
- #9 0x00007fb083679c63 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
复制代码
|
|