gpt4 book ai didi

linux - 为什么 "kill"与终端和 system() 不同?

转载 作者:太空狗 更新时间:2023-10-29 11:13:47 26 4
gpt4 key购买 nike

当我运行下面的脚本时,它将在远程主机上执行 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com