perl open() 总是 returns sh 而不是底层程序的 PID
perl open() always returns the PID of the sh instead of the underlying program
我必须终止通过
打开的程序
$pid = open(FH, "program|")
或
$pid = or open(FH, "-|", "program")
但是,程序(mosquittto_sub,具体来说)仍然在后台徘徊,因为 open
正在返回 perl 正在使用的 sh
的 PID 运行 程序,所以我只杀死 sh
包装器而不是实际程序。
有没有办法让程序获得真正的PID?获取 sh
的 PID 有什么意义?
有几种方法可以解决这个问题。
首先,您可以使用列表形式到open一个进程然后没有shell因此子进程(由 open
返回的 pid)正是您需要停止的程序所在的子进程
my @cmd = ('progname', '-arg1', ...);
my $pid = open my $fh, '-|', @cmd // die "Can't open \"@cmd\": $!";
...
my $num_signaled = kill 15, $pid;
此草图需要添加一些检查。请参阅链接文档(查找 "pipe")。
如果由于某种原因这不适合 -- 也许你 需要 shell 到 运行 那个程序 -- 那么你可以 找到程序的 pid,Proc::ProcessTable 模块对此很有用。基本演示
use Proc::ProcessTable;
my $prog_name = ...
my $pid;
my $pt = Proc::ProcessTable->new();
foreach my $proc (@{$pt->table}) {
if ($proc->cmndline =~ /\Q$prog_name/) { # is this enough to identify it?
$pid = $proc->pid;
last;
}
}
my $num_signaled = kill 15, $pid;
请小心通过名称识别程序 -- 在现代系统中,可能有各种进程 运行ning 包含您要终止的程序的名称。有关更多详细信息和讨论,请参阅 this post and ,对于初学者。
最后,您可以使用模块来运行您的外部程序,然后您将能够更好地管理和控制它们。这里我推荐IPC::Run.
我必须终止通过
打开的程序$pid = open(FH, "program|")
或
$pid = or open(FH, "-|", "program")
但是,程序(mosquittto_sub,具体来说)仍然在后台徘徊,因为 open
正在返回 perl 正在使用的 sh
的 PID 运行 程序,所以我只杀死 sh
包装器而不是实际程序。
有没有办法让程序获得真正的PID?获取 sh
的 PID 有什么意义?
有几种方法可以解决这个问题。
首先,您可以使用列表形式到open一个进程然后没有shell因此子进程(由 open
返回的 pid)正是您需要停止的程序所在的子进程
my @cmd = ('progname', '-arg1', ...);
my $pid = open my $fh, '-|', @cmd // die "Can't open \"@cmd\": $!";
...
my $num_signaled = kill 15, $pid;
此草图需要添加一些检查。请参阅链接文档(查找 "pipe")。
如果由于某种原因这不适合 -- 也许你 需要 shell 到 运行 那个程序 -- 那么你可以 找到程序的 pid,Proc::ProcessTable 模块对此很有用。基本演示
use Proc::ProcessTable;
my $prog_name = ...
my $pid;
my $pt = Proc::ProcessTable->new();
foreach my $proc (@{$pt->table}) {
if ($proc->cmndline =~ /\Q$prog_name/) { # is this enough to identify it?
$pid = $proc->pid;
last;
}
}
my $num_signaled = kill 15, $pid;
请小心通过名称识别程序 -- 在现代系统中,可能有各种进程 运行ning 包含您要终止的程序的名称。有关更多详细信息和讨论,请参阅 this post and
最后,您可以使用模块来运行您的外部程序,然后您将能够更好地管理和控制它们。这里我推荐IPC::Run.