我有一个小脚本执行批处理语句并开始下载流。批处理语句将一直持续到停止为止。我需要脚本继续到下一行(它设置正在创建的文件的位置),因为它只会在前一行代码(批处理语句)完成时继续。这可能吗?这是代码:
#!/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:$!";
答案 0 :(得分:0)
在类Unix系统上,您可以在后台运行命令
system("batch statment here &");
但是,您将不会从批处理命令获得返回状态,而是来自shell。
答案 1 :(得分:0)
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;
超时到期时,该进程将被终止。