Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  0 366
Hei

Jeg har laget et perl script som bruker tråder for å utføre kommandoer samtidig på to ssh servere. Jeg bruker Net::SSH::Perl modulen til dette selv om jeg vet at jeg bare kunne brukt ssh kommandoen for å utføre kommandoene rett i scriptet, bruker dette fordi jeg har lyst til å lære å bruke modulen og jeg synes den er mer behagelig å bruke.

Det er to tråder som kjører i programmet. Den første tråden starter opp, oppretter et SSH objekt og etter det så henger programmet. Når jeg kjører en strace mot programmet så får jeg følgende output:

Kode

Process 12899 attached - interrupt to quit
futex(0xb7c28bd8, FUTEX_WAIT, 12900, NULL^C <unfinished ...>
Noen som vet hvorfor dette skjer og hva jeg må gjøre for å få programmet til å kjøre som det skal ? Det programmet skulle gjort var å opprette to SSH forbindelser samtidig og utfører kommandoen "ls" samtidig. Jeg bruker kommandoen "ls" for å bare sjekke at dette faktisk fungerer, noe det tydligvis ikke gjør. Jeg har søkt en del på google og andre forumer uten å finne en løsning på dette, jeg har også lest en del på cpan, perldoc (bla. http://search.cpan.org/~nwclark/perl...perlthrtut.pod).

Perl koden er vist nedenfor:

Kode

#!/usr/bin/perl -w

use strict ;
use Net::SSH::Perl ;
use threads ;

my $host1 = "(some ip)" ;
my $host2 = "(some ip)" ;

# creating a new thread
my $thread1 = threads->create('connect_localhost') ;
my $thread2 = threads->create('connect_external') ;

# thread1 sub-routine
sub connect_localhost
{
        my $user = "user" ;
        my $password = "xxx" ;
        my $sshSession = Net::SSH::Perl->new($host1) ;

        print "connecting to $host1\n" ;
        $sshSession = Net::SSH::Perl->new($host1) ;
        print "ssh object created for $host1\n" ;
        $sshSession->login($user, $password) ;
        print "connected to $host1\n" ;
        $sshSession->cmd("ls") ;
        print "\nexecuting the command on $host1...\n\n" ;
}

# thread2 sub-routine
sub connect_external
{
        my $user = "user" ;
        my $password = "xxxx" ;
        my $sshSession = Net::SSH::Perl->new($host2) ;

        print "connecting to $host2\n" ;
        $sshSession = Net::SSH::Perl->new($host2) ;
        print "ssh object created for $host2\n" ;
        $sshSession->login($user, $password) ;
        print "connected to $host2\n" ;
        $sshSession->cmd("ls") ;
        print "\nexecuting the command on $host2...\n\n" ;
}

my $returnedLocalhost = $thread1->join() ;
my $returnedExternal = $thread2->join() ;

exit 0 ;
Jeg hadde $user, $password og $sshSession for globale variabler på toppen av scriptet, men jeg satt de inn i hver sin sub-rutine for å prøve å unngå alle mulige "race-conditions".
Sist endret av exceed; 10. januar 2009 kl. 14:57.