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

标签 linux bash perl ssh

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

相关文章:

perl - 为条件 OO 模块加载编写包装器模块的正确方法是什么?

linux - 锁定 C++11 std::unique_lock 导致死锁异常

linux - 用于检查文件夹创建日期与当前日期/时间的 Shell 脚本

加载共享库时出现 Linux 错误 : cannot open shared object file: No such file or directory

linux - rsync可以在同步前验证内容吗

php - 从 php 运行 csf 命令而不是 root

bash - 使用 bash 脚本在多个内核上运行可执行文件

bash - 在 Bash 中比较多个文件

regex - 以模式排列给定的线

mysql - Perl 导入大.csv 到 MySQL,不要重复数据