Есть несколько способов справиться с этим.
Во-первых, вы можете использовать форму списка до открыть процесс и тогда никакая оболочка не задействована, так что дочерний процесс (с pid, возвращаемым open
) - это именно тот, в котором программа, которую нужно остановить,
my @cmd = ('progname', '-arg1', ...);
my $pid = open my $fh, '-|', @cmd // die "Can't open \"@cmd\": $!";
...
my $num_signaled = kill 15, $pid;
Этот эскиз требует добавления некоторых проверок. Пожалуйста, смотрите связанную документацию (ищите "pipe").
Если это по какой-то причине не подходит - возможно, вам нужна оболочка для запуска этой программы - тогда вы можете найти pid программы , и модуль Pro c :: ProcessTable подходит для этого. Basi c demo
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;
Пожалуйста, будьте осторожны при идентификации программы по ее имени - в современной системе могут выполняться все виды процессов, которые содержат имя программы, которую вы хотите прервать , Для более подробной информации и обсуждения, пожалуйста, смотрите этот пост и этот пост , для начала.
Наконец, вы можете использовать модуль для запуска ваших внешних программ и тогда вы сможете управлять ими гораздо лучше. Здесь я бы порекомендовал IP C :: Run .