Perl (SSH к удаленному хосту, выдает команду и закрывает сеанс, не дожидаясь его завершения ...) - PullRequest
4 голосов
/ 27 января 2011

Скрипт отправляется на удаленный сервер и запускает скрипт оболочки «snap.sh», используя Net :: SSH :: Perl. Этот сценарий оболочки занимает почти 10 минут, и моя 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);

Ответы [ 4 ]

4 голосов
/ 27 января 2011

Поиск команды nohup. Вот краткий пост , с которого можно начать . Для полноты вот что должно работать в вашем случае ...

my $cmd="nohup ./bin/snap.sh &";
1 голос
/ 30 января 2011

Я использую 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;
1 голос
/ 27 января 2011

Чтобы запустить фоновое задание на удаленном хосте, вам также необходимо отделиться от любых управляющих ttys на локальном компьютере. Попробуйте команду вроде:

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

Я думаю, использование nohup необязательно.

1 голос
/ 27 января 2011

Не проверено, но вы не можете просто сделать то, что делает 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);
}
...