为什么这个Perl脚本在60秒后没有退出或死亡?



我需要运行一个名为sc.exe的应用程序,作为TeamCity构建过程的一部分。这个小应用程序打开了一个通往酱实验室的隧道,应用程序本身运行良好。这个应用程序的一个特点是,当它启动并准备支持通过隧道在酱上测试时,它输出消息Sauce Connect is up, you may now start your tests.。应用程序需要保持本地运行以保持隧道打开。

sc.exe在连接完成后不退出,但我需要构建步骤发送退出代码,以便它可以知道隧道已经建立,我们已经准备好了。我希望将Perl脚本转换为exit0,并让sc.exe进程继续运行。我用Perl写了这个小脚本:

#!/user/bin/perl
use strict;
use warnings;
my $result = `sc -v --pac file://browsermob.js -u $ENV{SAUCE_USER_NAME} -k $ENV{SAUCE_API_KEY}`;
for (my $i = 0; $i < 60; $i++) {
    if ($result =~ /Sauce Connect is up, you may start your tests./) {
        print $result;
        exit 0;
        }
    sleep(1);
    }
die "Did not detect open Sauce Connect tunnel.";

现在,请记住,当我从终端运行系统调用时,反引号中的系统调用确实有效,并且在这种情况下sc.exe的输出与预期的一样。当我运行这个Perl脚本时,隧道确实启动了—我可以登录到Sauce Labs并看到隧道是活动的。但是,该脚本既不退出0,也不退出die。它会做什么呢?

我觉得我像往常一样错过了一些很明显的东西。

在win7 x64或Windows Server 2008上运行,结果相同

由于反引号中的命令永远不会退出,因此它永远不会返回并且不会填充$result。尝试在管道中启动命令并从中读取:

open(my $sc, "-|", "sc -v --pac file://browsermob.js -u $ENV{SAUCE_USER_NAME} -k $ENV{SAUCE_API_KEY} &");
while (<$sc>) {
    print && exit 0 if /Sauce Connect is up, you may start your tests./;
}
close $sc;

注意命令末尾的&,以便在后台运行该命令。

要使它在60秒后超时,使用警报:

local $SIG{ALRM} = sub { die "Did not detect open Sauce Connect tunnel." };
alarm 60;

相关内容

  • 没有找到相关文章

最新更新