脚本转到远程服务器并使用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);
答案 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;