当我运行以下脚本时,它将在远程主机上执行sleep 123,然后终止本地ssh进程,该进程将退出远程主机上的sleep 123。这是预期的行为。
但是,如果我删除system("kill $p")并使用进程ID从终端执行kill命令,那么本地ssh就会被杀死,但是远程sleep 123仍然存在。没料到。
# /usr/gnu/bin/kill 961
Killed by signal 15.问题
为什么同一个kill命令不同,取决于从Perl的system()和终端执行它,以及当ssh连接被杀死时,远程sleep 123命令如何生存?
#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(5);
my $pid = $pm->start;
my $p = $pid;
if (!$pid) {
system("ssh 10.10.47.47 sleep 123");
$pm->finish;
}
$p = qx(/usr/bin/pgrep -P $p);
print "ssh pid is $p\n";
system("/usr/gnu/bin/kill $p");发布于 2014-12-11 21:53:35
即使是本地主机,ssh也要花费数十毫秒才能连接和执行命令。
当被脚本杀死时,ssh在启动后几毫秒内就会死掉,因此它永远没有机会在远程主机上执行该命令。
当被人类杀死时,ssh有多秒的时间连接和执行。
换句话说,sleep不会在第一种情况下死亡--它永远不会开始。
您可以通过让脚本在杀死ssh之前稍等片刻来确认这一点。
https://stackoverflow.com/questions/27431459
复制相似问题