【发布时间】:2014-12-12 05:53:35
【问题描述】:
当我运行下面的脚本时,它将在远程主机上执行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");
【问题讨论】:
-
kill是 bash 中的内置命令。我没有检查过,但它的行为可能与/usr/bin/kill或/usr/gnu/bin/kill的行为不同。 -
您的代码中有一个令人讨厌的竞争条件。如果
ssh进程在您调用pgrep和kill之间死亡,并且新进程获得相同的PID,则您可能将kill发送到错误的进程。 -
我相信你错了。
-
交互式地,您是否使用来自
ssh pid is ..消息的 pid 运行/usr/gnu/bin/kill?脚本是否同时退出? -
@thatotherguy Perl 脚本仍在运行,因为该脚本派生了 ssh 进程,因此返回了终端。是的,这就是我正在使用的 pid。