当我运行下面的脚本时,它将在远程主机上执行 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()
和从终端执行而有所不同,以及远程 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");
最佳答案
即使是本地主机,ssh
也需要数十毫秒才能连接并执行命令。
当被脚本终止时,ssh
会在启动后的几毫秒内终止,因此它永远没有机会在远程主机上执行命令。
当被人杀死时,ssh
有几秒钟的时间来连接和执行。
换句话说,sleep
在第一种情况下并没有结束——它永远不会开始。
您可以通过让您的脚本在终止 ssh 之前等待一秒钟来确认这一点。
关于linux - 为什么 "kill"与终端和 system() 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431459/