为什么"杀死"不同于终端和系统()?

时间:2014-12-11 20:05:28

标签: linux bash perl ssh

当我运行以下脚本时,它将在远程主机上执行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");

1 个答案:

答案 0 :(得分:2)

即使是本地主机,ssh也需要几十毫秒才能连接并执行命令。

当被脚本杀死时,ssh会在启动后的几毫秒内死亡,因此它永远不会有机会在远程主机上执行命令。

当被人类杀死时,ssh有多秒连接并执行。

换句话说,sleep在第一种情况下不会死 - 它永远不会开始。

您可以通过让您的脚本在杀死ssh之前等待一秒来确认这一点。