为什么“kill”与terminal和system()不同?

当我运行下面的脚本,它将在远程主机上执行sleep 123 ,然后终止本地ssh进程,这将退出远程主机上的sleep 123 。 这是预期的行为。

但是,如果我删除了system("kill $p")并从具有进程ID的terminal执行kill命令,则在本地ssh被终止时,远程sleep 123仍然存在。 没有预料到。

 # /usr/gnu/bin/kill 961 Killed by signal 15. 

为什么相同的kill命令有所不同,取决于从Perl的system()和terminal执行它,以及当ssh连接被终止时,remote 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"); 

即使是本地主机, ssh也需要几十毫秒的时间来连接和执行命令。

当被脚本杀死的时候, ssh会在几毫秒内死亡,所以它永远不会有机会在远程主机上执行命令。

当被人杀死的时候, ssh有多个秒的连接和执行。

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

杀死ssh之前,你可以通过让脚本等待一秒来确认。