windows – 带子进程的perl报警
我有一个perl脚本,它运行一系列用于回归测试的批处理脚本.我想在批处理脚本上实现超时.我目前有以下代码.
my $pid = open CMD,"$cmd 2>&1 |"; eval { # setup the alarm local $SIG{ALRM} = sub { die "alarmn" }; # alarm on the timeout alarm $MAX_TIMEOUT; log_output("setting alarm to $MAX_TIMEOUTn"); # run our exe while( <CMD> ) { $$out_ref .= $_; } $timeRemaining = alarm 0; }; if ($@) { #catch the alarm,kill the executable } 问题是,无论我将最大超时设置为什么,警报都不会被触发.我尝试过使用Perl :: Unsafe :: Signals,但这没有帮助. 如果我想能够捕获它们的输出,这是执行批处理脚本的最佳方法吗?是否有另一种方法可以做同样的事情,允许我使用警报,或者除警报之外还有另一种方法可以使程序超时吗? 我已经构建了一个测试脚本来确认警报是否适用于我的perl和windows版本,但是当我运行这样的命令时它不起作用. 我在windows 7 x64上使用activeperl 5.10.1运行它. 解决方法
很难判断警报何时起作用,何时系统调用将不会被SIGALRM中断,相同代码在不同操作系统上的行为方式如何等等.
如果你的工作超时,你想要杀死你已经开始的子进程.这是穷人警报的一个很好的用例: my $pid = open CMD,"$cmd 2>&1 |"; my $time = $MAX_TIMEOUT; my $poor_mans_alarm = "sleep 1,kill(0,$pid)||exit for 1..$time;kill -9,$pid"; if (fork() == 0) { exec($^X,"-e",$poor_mans_alarm); die "Poor man's alarm failed to start"; # shouldn't get here } # on Windows,instead of fork+exec,you can say # system 1,qq[$^X -e "$poor_mans_alarm"] ... 穷人的警报在一个单独的过程中运行.每秒,它检查标识符$pid的进程是否仍然存在.如果进程未处于活动状态,则退出警报进程.如果进程在$time秒后仍处于活动状态,它会向进程发送一个kill信号(我使用9来使其无法访问,而-9用于取出整个子进程树,您的需求可能会有所不同). (exec实际上可能没有必要.我使用它是因为我也使用这个成语来监视可能比启动它们的Perl脚本更长的进程.因为这不是问题的情况,你可以跳过exec调用说 if (fork() == 0) { for (1..$time) { sleep 1; kill(0,$pid) || exit } kill -9,$pid; exit; } 代替.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- unit-testing – 无法加载应用程序或执行命令’M
- windows-server-2003 – Windows命令控制台的替换
- .net – PDFLibNet.dll或它是否拥有商业产品的许
- 无法在Windows上安装python lxml(和libxml2)
- ZOJ Problem Set - 2480 Simplest Task in Windo
- .net – 任务栏中应用程序图标上的Win7进度条?
- windows-server-2012-r2 – Windows Server 2012
- windows-7 – Windows 7是否支持Hyper-V Manager
- active-directory – 如何还原Windows Server 20
- Windows表单C#按代码更改用户控件