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

时间:2014-01-01 18:09:29

标签: perl line next

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

#!/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:$!";

2 个答案:

答案 0 :(得分:0)

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

system("batch statment here &");

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

答案 1 :(得分:0)

perlfaq8中的

How do I start a process in the background列出了几个可以使用的模块,但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限制外部命令运行的时间,而不是使用Proc::Background方法创建new对象:

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

超时到期时,该进程将被终止。