Perl(SSH到远程主机,发出命令并关闭会话而不等待它完成...)

时间:2011-01-27 14:36:02

标签: perl scripting ssh

脚本转到远程服务器并使用Net :: SSH :: Perl运行shell脚本“snap.sh”。 这个shell脚本需要大约10分钟才能结束,我的perl程序会一直等到输出结束。 我想在远程服务器上运行shell脚本,程序应关闭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);

4 个答案:

答案 0 :(得分:4)

查找nohup命令。这是quick post to get you started。为了完整起见,这是你应该做的事情......

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

答案 1 :(得分: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);
}

答案 2 :(得分:1)

要在远程主机上运行后台作业,还需要与本地计算机上的任何控制ttys分离。尝试以下命令:

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

我认为使用nohup是可选的。

答案 3 :(得分:1)

我使用Net::OpenSSH。它有一个 spawn 方法,可以完全满足您的需求。

  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;