2017-11-15 3 views
0

この質問に対する答えは、単に「parallel-sshの使用をやめ、netmiko/paramikoを使って独自のコードを書いてください。また、既にpython 3にアップグレードしてください。パラレルSSH - 一定時間後にsshチャネルを閉じる方法は?

私の問題は次のとおりです。parallel-sshを使用して一度に80台までのデバイスにヒットしようとしています。これらのデバイスは、信頼性が低いと知られています.1〜2行の出力を与えた後、時折フリーズします。それから、並列sshコードが数時間停止し、スクリプトが実行されたままになります。私は週末の後にスクリプトを実行しているVMに飛び乗って、52時間立ち往生している仕事を見ました。

私の最初のコードの関連部分、ハング1:私はそれがコマンド出力を得るために4分以上かかる場合ので、私は、channel_timoutオプション次いで試してみました

from pssh.pssh2_client import ParallelSSHClient 
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd): 
    client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False) 
    result = client.run_command(cmd, stop_on_errors=False) 
    return result 

次の事デバイスが凍結したことを知っている、と私はスクリプトで、後でそれを上に移動し、サイクルする必要があります。

from pssh.pssh_client import ParallelSSHClient 
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd): 
    client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, channel_timeout=180, retry_delay=60, pool_size=100, allow_agent=False) 
    result = client.run_command(cmd, stop_on_errors=False) 
    return result 

このバージョンでは、決して実際には何に接続します。何かアドバイス?私はchannel_timeout以外の何かを見つけることができず、一定の時間がたつとsshセッションを終了しようとしました。

答えて

0

コードでは、関数内にクライアントオブジェクトを作成してから、の出力のみを返します。これは、run_commandの出力で、SSHサーバーへのリモートチャネルを含みます。

オブジェクトは関数によって返されることはないので、スコープ外になり、接続を閉じるPythonによってガベージコレクトされます。

閉じた接続でリモートチャネルを使用しようとしても動作しません。スタックされたスクリプトのスタックトレースをキャプチャすると、おそらくリモートチャネルまたは接続を使用している可能性があります。

クライアントを存続させるようにコードを変更してください。クライアントは理想的には再利用しなければなりません。

from pssh.pssh2_client import ParallelSSHClient 

def remote_ssh(ip_list, ssh_user, ssh_pass, cmd): 
    client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False) 
    result = client.run_command(cmd, stop_on_errors=False) 
    return client, result 

コードは、それがぶら下がっているところの、すなわちキャプチャスタックトレースを問題を解決することはできません結論にジャンプする前に間違っている場合、あなたが理解していることを確認します。同じことをしている同じコードは同じ方法で壊れます。

関連する問題