2011-01-27 25 views
4

スクリプトはリモートサーバーに行き、Net :: SSH :: Perlを使用してシェルスクリプト "snap.sh"を実行します。 このシェルスクリプトはほぼ10分で終了し、私のperlプログラムは出力されるまで待機します。 リモートサーバー上でシェルスクリプトを実行すると、プログラムはリモートサーバー上でスクリプトが終了するのを待たずに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); 
} 
+0

同じ問題は起こらず、プログラムは終了しません..リモートサーバーからステータスを取得するために待機しています – Xomo

+0

@Xomo:あなたのプラットフォームは何ですか? Windowsの場合、 'fork'エミュレーションは問題があり、それを引き起こす可能性があります。 – ephemient

+0

...ありがとうございました。申し訳ありません、私は最後に間違いました...少し説明してください。それの背後にあるコンセプトは何ですか? – Xomo

4

nohupコマンドを参照してください。ここにはquick post to get you startedがあります。完全を期すためにここに...あなたのケースで動作するはず何です

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

アンドリュー、私はこれを試しました。リモートサーバーのバックグラウンドでcmdを実行していますが、セッションは閉じられていません。これはまだ待機中です。私はそれがNET :: SSH :: Perlモジュールと関係があったと思います。 – Xomo

+0

セッションを終了するには、ログアウト/終了が必要です。私はそれが単に質問から省略されたと仮定した。 –

+0

my($ stdout、$ stderr、$ exit)= $ ssh-> cmd($ cmd); このコマンドでスクリプトは停止し、リモートコマンドが終了するのを待ちます.... – Xomo

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; 
関連する問題