2011-01-27 74 views
4

腳本進入遠程服務器並使用Net :: SSH :: Perl運行shell腳本「snap.sh」 。 這個shell腳本需要將近10分鐘才能結束,我的perl程序一直等到它輸出。 我想在遠程服務器上運行shell腳本,並且程序應該關閉SSH會話而無需等待腳本在遠程服務器上完成。Perl(SSH到遠程主機,發出命令並關閉會話而不等待它完成...)

my $ssh = Net::SSH::Perl->new($host, protocol =>2); 
$ssh->login($username, $password); 
my $cmd="./bin/snap.sh"; 
my($stdout, $stderr, $exit) = $ssh->cmd($cmd); 

回答

1

未經檢驗的,但你不能只是做ssh -f呢?

my $ssh = Net::SSH::Perl->new($host, protocol =>2); 
$ssh->login($username, $password); 
defined (my $pid = fork) or die "fork: $!"; 
if ($pid) { 
    close $ssh->sock; 
    undef $ssh; 
} else { 
    my $cmd="./bin/snap.sh"; 
    my($stdout, $stderr, $exit) = $ssh->cmd($cmd); 
    POSIX::_exit($exit); 
} 
4

查找nohup命令。這裏是quick post to get you started。爲了完整這裏什麼都要工作你的情況......

my $cmd="nohup ./bin/snap.sh &"; 
+1

Andrew,我試過了。它在遠程服務器的後臺運行cmd,但會話沒有關閉..它仍在等待。我想這與NET :: SSH :: Perl模塊有很大關係 – Xomo 2011-01-27 16:35:50

+0

您仍然需要註銷/退出才能結束會話。我認爲這是從問題中省略的。 – 2011-01-27 16:51:12

1

要在遠程主機上運行後臺作業,還需要解除本地計算機上的任何控制ttys的分離。試試如下命令:

my $cmd = "./bin/snap.sh </dev/null> /dev/null 2>&1 &"; 

我想用nohup是可選的。

1

我爲此使用Net::OpenSSH。它有一個產卵方法,確實是你在找什麼。

my %conn = map { $_ => Net::OpenSSH->new($_) } @hosts; 
    my @pid; 
    for my $host (@hosts) { 
     open my($fh), '>', "/tmp/out-$host.txt" 
     or die "unable to create file: $!"; 
     push @pid, $conn{$host}->spawn({stdout_fh => $fh}, $cmd); 
    } 

    waitpid($_, 0) for @pid;