2011-10-17 21 views
2

我有一个产生线程的服务。
线程通过提供目标函数来启动。
看起来线程在函数结束时不会“死”。我知道这是因为该线程与Paramiko(通过Fabric)建立了一些SSH连接,如果我做了lsof,我看到在该函数完成后SSH连接仍然处于活动状态。
如何确保线程在其目标函数完成时死亡?如何确保Python线程在其目标函数完成后死亡?

下面是一个例子就是我一起工作:

from time import sleep 
from threading import Thread 
from fabric.api import run, settings 

def thread_func(host): 
    with settings(host_string=host): 
     run('ls -lht /tmp') 

def spawn_thread(host): 
    t = Thread(
     target=thread_func, 
     args=(host,) 
    ) 
    t.start() 

spawn_thread('node1.example.com') 
while True: 
    sleep(1) 

如果我在另一个终端上运行sudo lsof | grep ssh,而上面的代码是在它的无限循环,我会看到如下,即使我知道该线程不应该存在了:

python 6924  daharon 3u  IPv4    170520  0t0  TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED) 
python 6924  daharon 5u  IPv4    170524  0t0  TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED) 
python 6924 6930 daharon 3u  IPv4    170520  0t0  TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED) 
python 6924 6930 daharon 5u  IPv4    170524  0t0  TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED) 
python 6924 6932 daharon 3u  IPv4    170520  0t0  TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED) 
python 6924 6932 daharon 5u  IPv4    170524  0t0  TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED) 
+0

线程函数是否实际完成?如果在with:run()块之前和之后放置打印语句,您是否看到run()实际返回? – Dave

回答

2

你确定你的结构模块是做SSH只为ls命令的持续时间。也就是说,它应该做的

SSH主机LS -lht/tmp目录

此命令行会打开一个远程shell运行LS -lht命令,然后关机等效。

但我怀疑的面料库可能会做等价的:

SSH主机

主机$ LS -lht/tmp目录 。 。

当然,它不提供真正的tty,但有不同的ssh选项,允许保持连接打开,而无需交互式tty。这在某些情况下是可取的(例如,如果您在同一主机上运行大量命令,则此技术将重新使用现有的ssh会话,而不是每次都打开新会话。请查看文档以获取启用或禁用此类会话缓存的参数。

+0

您是对的,Fabric不会创建新会话对于每个命令来说,会话​​都被缓存了,但我期待完成线程函数来关闭所有会话。 – daharon

相关问题