2

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

这是我正在使用的示例:

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)
4

1 回答 1

2

您确定您的结构模块仅在 ls 命令期间执行 ssh。也就是说,它应该做相当于

ssh 主机 ls -lht /tmp

此命令行将打开一个远程 shell 以运行 ls -lht 命令,然后关闭。

但我怀疑 Fabric 库可能相当于:

ssh 主机

主机$ ls -lht /tmp 。.

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

于 2011-10-17T19:21:04.840 回答