Perl-在上一行完成之前需要继续下一行

wi3ka0sx  于 2023-06-23  发布在  Perl
关注(0)|答案(2)|浏览(196)

我有一个小脚本,它执行一个批处理语句并开始下载一个流。批处理语句将继续进行,直到停止。我需要脚本继续到下一行(在那里它设置了正在创建的文件的位置),因为它只会继续当前一行代码(批处理语句)完成。这可能吗?下面是代码:

#!/usr/bin/perl
use strict;
use warnings;

my $test_path= "http://xxx.xxx.x.x:8000/test/stream1.m3u8";
my $status = system("batch statment here");                
print "Location: $test_path\n\n" or die "can't do it:$!";
ktca8awb

ktca8awb1#

如何在perlfaq 8中的后台启动一个进程列出了几个可以使用的模块,但是Proc::Background对于这个特定的任务来说似乎是最简单的。它可以在Windows和 *nix上工作,所以如果你切换操作系统,你不应该改变你的Perl代码(尽管你必须改变你调用的外部命令)。像这样运行:

use Proc::Background;

my $proc = Proc::Background->new($command, $arg1, $arg2)
        or die "Failed to run $command: $!";

# Do stuff

my $wait_status = $proc->wait;
my $exit_code = $wait_status >> 8;
print "$command finished with exit code $exit_code\n";

new方法的工作方式与内置的system命令非常相似。您可以像我上面所做的那样,传递一个参数列表,命令名后跟参数(不调用shell);或者传递一个包含命令及其参数的字符串(确实调用shell)。
在Windows上,可以将绝对或相对路径传递给可执行文件:
如果可执行文件的名称是绝对路径,则new将检查该可执行文件是否存在于给定位置,否则将失败。如果可执行文件的名称不是绝对的,则使用PATH环境变量搜索可执行文件。输入的可执行文件名称总是替换为此进程确定的绝对路径。
此外,在搜索可执行文件时,将使用未更改的可执行文件名称搜索可执行文件,如果未找到,则在名称后附加“.exe”进行检查,以防传递的名称不带“.exe”后缀。
请注意,在某些时候,如果您想获得批处理命令的退出状态,则必须调用$proc->wait。如果进程仍在运行,则必须等待它完成(惊喜,惊喜)。但是,您可以将此步骤推迟到脚本结束时,并在此期间完成一些其他工作。
如果你需要终止进程,你可以使用$proc->die,如果进程已经停止或者已经死亡,则返回1,否则返回0
您也可以将die_upon_destroy选项设置为new,以便在相应的Proc::Background对象被销毁时终止进程:

my $proc = Proc::Background->new({ die_upon_destroy => 1 }, $command, $arg1, $arg2);
$proc = undef;  # $command killed via die() method

请注意这是如何与词法作用域一起工作的:

{
    my $proc = Proc::Background->new({ die_upon_destroy => 1 }, $command, $arg1, $arg2);
}
# Lexical variable $proc is now out of scope, so $command is killed

您也可以使用timeout_system来限制外部命令的运行时间,而不是使用new方法创建Proc::Background对象:

my $wait_status = timeout_system($seconds, $command, $arg1, $arg2);
my $exit_code = $wait_status >> 8;

当超时过期时,进程将被终止。

uubf1zoe

uubf1zoe2#

在类Unix系统上,可以在后台运行命令

system("batch statment here &");

但是,您将不会从批处理命令中获得返回状态,而是从shell中获得。

相关问题