2015-01-14 3 views
2

У меня есть код, как показано ниже. Моя проблема в том, что происходит сбой в случайной основе со следующей ошибкой:Perl Net :: SSH2 с отключением потока

perl: ath.c:193: _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed. 

Как, если я бегу времени код 10 он падает в 2-3 раза. Как это исправить?

use warnings; 
use strict; 
use Net::SSH2; 
use threads; 

sub gsmExec { 
    $host = $_[0]; 
    $port = $_[1]; 
    $user = $_[2]; 
    $pass = $_[3]; 
    my $modem = Net::SSH2->new(); 
    print "Trying to connect host $host : $port \n"; 
    if($modem->connect($host,$port)) { 
     print "connected to host ..\n"; 

     if ($modem->auth_password($user,$password) { 
      print "Authorized!!"; 
     } 
    } 
} 

for(my $j = 1; $j <= $modemCount; $j++){ 
     $thrList[$j] = threads->create(\&gsmExec,'host',22,'user','pass'); 
} 
+0

Возможно, это связано с некоторой ошибкой в ​​Net :: SSH2 или в libssh2. Единственное решение - найти и исправить. – salva

+0

hmm .. Я заменил нитки вилками, которые решили мою проблему. –

+0

Если вы собираетесь запускать свой скрипт в окне Linux/Unix, вы можете использовать [Net :: OpenSSH] (https://metacpan.org/pod/Net::OpenSSH) [:: Parallel] (https : //metacpan.org/pod/Net :: OpenSSH :: Parallel) вместо этого! – salva

ответ

2

Это на самом деле не perl ошибка есть - это немного кода C внутри Net::SSH библиотеки.

Есть некоторые признаки того, что вы не только один, чтобы поразить эту проблему:

http://www.perlmonks.org/?node_id=936201

http://lists.gnupg.org/pipermail/gcrypt-devel/2006-January/000910.html

Казалось бы, что может быть ошибка в GnuTLS, что делает его не безопасный поток. Методы обхода:

  • одиночная нить бит TLS.
  • использование fork вместо резьбы. (Parallel::ForkManager довольно хорош для этого).
  • Net::OpenSSH::Parallel также может сделать трюк.
Смежные вопросы