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

时间:2014-05-22 16:40:35

标签: windows multithreading perl process exit

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

在建立连接后,

sc.exe不会退出,但是我需要构建步骤来发送退出代码,以便它可以知道隧道已启动,我们已准备就绪。我希望Perl脚本exit 0并让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。它能做什么?

我觉得我像往常一样缺少一些如此明显的东西。

在Win 7 x64或Windows Server 2008上运行,结果相同。

1 个答案:

答案 0 :(得分:7)

由于反引号中的命令永远不会退出,因此它永远不会返回并且不会填充$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秒后让它超时,请使用alarm

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