kyo*_*oob 2 windows perl multithreading process exit
我需要运行一个sc.exe在TeamCity中作为构建过程的一部分调用的应用程序.这个小应用程序打开了通往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.";
Run Code Online (Sandbox Code Playgroud)
现在,请记住,当我从终端运行它时,反引号中的系统调用确实有效,并且输出来自sc.exe那个情况下的预期.当我运行这个Perl脚本时,隧道确实启动了 - 我可以登录Sauce Labs并看到隧道是活动的.但是,这个脚本既不会退出0也不会退出die.它能做什么?
我觉得我像往常一样缺少一些如此明显的东西.
在Win 7 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;
Run Code Online (Sandbox Code Playgroud)
请注意&命令末尾在后台运行命令.
要在60秒后使其超时,请使用警报:
local $SIG{ALRM} = sub { die "Did not detect open Sauce Connect tunnel." };
alarm 60;
Run Code Online (Sandbox Code Playgroud)