2011-10-17 13 views
2

スレッドを生成するサービスがあります。
スレッドは、ターゲット関数を提供することによって開始されます。
関数が終了すると、スレッドが "死んでいない"ように見えます。私はこのスレッドがParamikoFabric経由)といくつかの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()ブロックの前後にprintステートメントを置くと、run()が実際に返ってくることがわかりますか? – Dave

答えて

2

ことは、あなたのファブリックモジュールのみlsコマンドの持続時間の間にsshをやっていることを確認されています。つまり、このコマンドラインは、LS -lhtコマンド、その後、シャットダウンを実行するためのリモートシェルを開きます

SSHホストLSの同等-lht/tmpの

をやるべきこと、です。

ホストの$ LS -lht

SSHホストの/ tmp :

は、しかし、私はファブリックライブラリは同等のものをやっているかもしれないと思います。 。

もちろん、実際のttyは提供されていませんが、インタラクティブなttyなしで接続を開いたままにすることができるsshオプションがあります。例えば、同じホスト上でたくさんのコマンドを実行する場合、このテクニックは毎回新しいセッションを開くのではなく、既存のsshセッションを再利用します。

+0

あなたは正しいです、Fabricは新しいセッションを作成しませんセッションがキャッシュされていますが、私はすべてのセッションを閉じるためにスレッド関数の完了を期待していました。 – daharon

関連する問題