Я думаю, что реальный вопрос, который вы хотите задать, это «Как запустить процесс в фоновом режиме (и, возможно, убить его позже)?»
Самое простое решение - open
труба из процесса.Так что вместо
my $output = qx/some_command/;
# do something with $output
вы бы сделали
my $pid = open my $pipe, "some_command |" or die $!;
while (my $line = <$pipe>) {
# do something with $line
last if some_condition();
}
close $pipe or $! and die $!;
Если вы close
передадите канал до завершения дочернего процесса, то при следующей попыткечтобы вывести что-то, он получит сигнал SIGPIPE, который обычно его убивает.Если вы подозреваете, что процесс может продолжать работать без вывода какого-либо результата, вы можете kill
вручную, например,
kill $pid, 1; # 1 == SIGHUP on most Unix systems
(Вы должны сделать это до закрытия канала, так как close
будет ожидать завершения процесса.)
Однако учтите, что если Perl должен был вызывать оболочку для анализа вашей команды, идентификатор процесса, возвращаемыйopen
будет оболочкой, а не самой командой.Вы можете избежать этого, используя форму с несколькими аргументами open
:
my $pid = open my $pipe, '-|', $command, @command_args or die $!;