Perl - 需要在上一行完成之前继续下一行
Posted
技术标签:
【中文标题】Perl - 需要在上一行完成之前继续下一行【英文标题】:Perl- Need to continue with next line before previous is finished 【发布时间】:2014-01-01 18:09:29 【问题描述】:我有一个执行批处理语句并开始下载流的小脚本。批处理语句将继续执行,直到它停止。我需要脚本继续到下一行(它设置正在创建的文件的位置),因为它只会在上一行代码(批处理语句)完成时继续。这可能吗?代码如下:
#!/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:$!";
【问题讨论】:
见来自 perlfaq8 的How do I start a process in the background。 Windows 7 专业版 您的意思是print
的输出将被您启动的进程使用吗?
打印的输出不会被进程消耗。该过程实时创建视频文件。启动批处理文件后,我需要执行下一行。对于剩余的 Perl 脚本,我不需要批处理文件中的任何返回值。只需要执行下一行将用户视频播放器引导到批处理文件创建文件的路径。
【参考方案1】:
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
来限制外部命令的运行时间,而不是使用new
方法创建Proc::Background
对象:
my $wait_status = timeout_system($seconds, $command, $arg1, $arg2);
my $exit_code = $wait_status >> 8;
超时后进程将被杀死。
【讨论】:
【参考方案2】:在类 Unix 系统上,可以在后台运行命令
system("batch statment here &");
但是,您不会从批处理命令获得返回状态,而是从 shell 获得。
【讨论】:
按照建议我尝试在后台运行它,但下一行仍然没有执行。以上是关于Perl - 需要在上一行完成之前继续下一行的主要内容,如果未能解决你的问题,请参考以下文章