mikedshelton has asked for the wisdom of the Perl Monks concerning the following question:

Good Evening,

I have a functional Net::SFTP program, however, Net::SFTP->new(...) does not have a built in TIMEOUT parameter.

I have not used $Sig{ALRM} before. After researching / reading ALOT of resources I have hacked the following code.

What I want to do ... Capture a no-response situation from the remote host after XXX seconds, notify user of error (page, email) and end program.

Are there other situations that my example may not be catching ?

Is there a better use of $SIG{ALRM} when compared to my example ?

#notify user attempting connection writeLog( "Connecting to host : $host as user : $user" ); #open connection eval { #timeout if no response within 120 seconds $SIG{ALRM} = sub {die "Net::SFTP timed out\n"}; alarm(120); $sftp = Net::SFTP->new($host, user=>$u password=>$p debug=>1); alarm(0); }; if ( $@ ) { #handle error opening connection alarm(0); chomp( $@ ); writeLog( "Error: $@ trying to connect to remote $host"); sendEmail(); sendPage(); die("\n"); } alarm(0); writeLog("Connected to host : $host as user : $user");

Replies are listed 'Best First'.
Re: ??? proper use of $SIG{ALRM} with SFTP ???
by Zaxo (Archbishop) on Dec 19, 2003 at 00:43 UTC

    That looks fine. You don't load the signal handler down with code ( not a big deal with __DIE__ or __WARN__, but a major issue with OS signals). You have a nice try..catch structure. It would be hard to improve on that aspect of your code.

    Can the writeLog(), sendEmail(), and sendPage() functions fail? It would be worthwhile to check them if so, and if you can do anything about it.

    After Compline,
    Zaxo

Re: ??? proper use of $SIG{ALRM} with SFTP ???
by duff (Parson) on Dec 19, 2003 at 01:50 UTC

    While I agree with Zaxo, a better thing to do might be to add the timeout facility to Net::SFTP itself. :-)