perl open () всегда возвращает PID sh вместо базовой программы - PullRequest
3 голосов
/ 18 февраля 2020

Мне нужно убить программу, которую я открываю через

$pid = open(FH, "program|")

или

$pid = or open(FH, "-|", "program")

Однако программа ( mosquittto_sub, если быть точным c) все еще остается в фоновом режиме, потому что open возвращает PID sh, который perl использует для запуска программы, поэтому я убиваю только оболочку sh вместо самой программы.

Есть ли способ получить программы с реальным PID? Какой смысл получать PID sh?

1 Ответ

8 голосов
/ 18 февраля 2020

Есть несколько способов справиться с этим.

Во-первых, вы можете использовать форму списка до открыть процесс и тогда никакая оболочка не задействована, так что дочерний процесс (с 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...