如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?

Posted

技术标签:

【中文标题】如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?【英文标题】:How can I start a background process on a remote machine using perl and Net::OpenSSH? 【发布时间】:2012-11-05 07:05:56 【问题描述】:

我正在尝试使用Net::OpenSSH 登录远程机器,并启动后台进程。

my $ssh = Net::OpenSSH->new( $username . "\@" . $host, key_path => $key, async => 1);

$ssh->error and die "Open ssh error: " . $ssh->error;

my $out = $ssh->system("nohup ./apache-jmeter-2.8/bin/jmeter-server > /dev/null &");

print $out;

当它运行时,它会登录到机器,我得到 jmeter-server 提示 - 如果我输入 ctrl-C,则 perl 脚本会继续,并且 jmeter-server 进程会正常启动。

我尝试了使用和不使用 async 参数的 Net::OpenSSH->new() 调用,我还尝试在命令上使用 nohup,没有任何区别。

我怎样才能消除对ctrl-c 的需要,以便脚本可以在无人值守的情况下运行?

【问题讨论】:

您想在 perl 脚本完成后保持远程程序运行还是仅在它运行时保持运行? @salva:我希望它在脚本完成后继续作为后台任务运行。 那么,您必须使用system 方法并使用nohup 将所有stdio 通道重定向到/dev/null 运行命令:"nohup $program >/dev/null 2>&1 </dev/null &" 成功了!把它写成答案,我会接受的。 【参考方案1】:

根据Net::OpenSSH manual,您希望将 async => 1 标志赋予 system() 调用。

async => new() 调用上的 1 没有做你认为它可能做的事情

【讨论】:

不错。一旦我在系统中找到异步标志,我就没有读那么远。 :-)

以上是关于如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 perl 的 openssh 中指定 -v 选项

如何使用 Perl 的 OpenSSH 读取输出的每一行

Net::OpenSSH 中的交互模式

Perl:使用 Net::OpenSSH 的 scp_put 拒绝权限

在 Perl 的 ssh 连接中捕获错误主机名的错误消息(使用 Net::OpenSSH)

ctl_dir /root/.libnet-openssh-perl/ 在 /usr/local/share/perl/5.18.2/Net/OpenSSH/Compat/Perl.pm 第 123