2

スレッドを生成するサービスがあります。
スレッドは、ターゲット関数を提供することによって開始されます。
関数が終了しても、スレッドは「死ぬ」ことはないように見えます。これは、スレッドが( Fabricを介して) Paramikoと SSH 接続を行うためです。これを行うと、関数の完了後も SSH 接続がまだアクティブであることがわかります。 ターゲット関数が完了したときにスレッドが確実に終了するようにするにはどうすればよいですか?lsof

これが私が取り組んでいるものの例です:

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

このコマンドラインは、リモートシェルを開いてls -lhtコマンドを実行してから、シャットダウンします。

しかし、Fabricライブラリは次と同等のことをしているのではないかと思います。

sshホスト

host $ ls -lht/tmp。。

もちろん、実際のttyを提供しているわけではありませんが、インタラクティブなttyなしで接続を開いたままにしておくことができるさまざまなsshオプションがあります。これは特定の場合に望ましいでしょう(たとえば、同じホストで多くのコマンドを実行する場合、この手法は毎回新しいセッションを開くのではなく、既存のsshセッションを再利用します。そのようなセッションキャッシュを有効または無効にする引数については、ドキュメントを確認してください。

于 2011-10-17T19:21:04.840 に答える