如何使用 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:使用 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