多くのサーバーで特定のファイルの存在を確認するために、paramiko
sshを使用してリモートコマンドを実行するために使用するスレッドクラスを作成しました。各スレッドの結果はスレッドセーフに挿入され、Queue.Queue
すべての処理が完了した後でその内容を読み取りますjoin()
。これはスレッドの主要部分です:
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(self.server, username='linqmap', timeout=5)
stdin, stdout, stderr = client.exec_command('my_command')
このソリューションはうまく機能しますが、私の注意を引いた奇妙な動作があります。スレッドはその__init__
時間を記録します:
def __init__(self, server, queue, lock):
...
self.start_time=datetime.datetime.now()
...
そして、その終了時間(結果がキューに挿入された時間):
def _report(self, message, status):
duration=datetime.datetime.now()-self.start_time
...
self.queue.put( (self.server, duration, message, status) )
問題は、期間がすべてのスレッドで非常に似ていることです。少数(〜5)のスレッドの場合、約3秒です。数値が大きい場合(〜100)、約30秒です。
接続には5秒のタイムアウトがあるため、すべてのスレッドが5秒で終了するか、失敗すると推測しました。ここで何が起こったのか分かりますか?