当我运行以下脚本时,它将在远程主机上执行sleep 123
,然后终止本地ssh进程,该进程将退出远程主机上的sleep 123
。这是预期的行为。
但是,如果我从具有进程ID的终端中删除system("kill $p")
并执行kill
命令,则当本地ssh被终止时,但远程sleep 123
仍然存在。没想到。
# /usr/gnu/bin/kill 961
Killed by signal 15.
问题
为什么相同的kill
命令会有所不同,具体取决于从Perl的system()
和终端执行它,以及远程sleep 123
命令在ssh连接时如何生存被杀了?
#!/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");
答案 0 :(得分:2)
即使是本地主机,ssh
也需要几十毫秒才能连接并执行命令。
当被脚本杀死时,ssh
会在启动后的几毫秒内死亡,因此它永远不会有机会在远程主机上执行命令。
当被人类杀死时,ssh
有多秒连接并执行。
换句话说,sleep
在第一种情况下不会死 - 它永远不会开始。
您可以通过让您的脚本在杀死ssh之前等待一秒来确认这一点。