如何设置cmd命令的超时?

时间:2012-12-05 10:04:53

标签: perl cmd

我在cmd中只有以下命令

perl csv2rrd3.pl

但它总是运行很长时间。 有没有办法为它设置超时? 或者我应该在perl脚本中做到这一点?怎么样?

由于

4 个答案:

答案 0 :(得分:8)

在Perl内部,您可以设置alarm几秒钟后关闭。然后,您可以使用信号处理程序来捕获事件。任何时候只能激活一个警报

{ # enter new scope
    # set signal handler
    local $SIG{ALRM} = sub {
       # do cleanup, like closing sockets or whatever
       print STDERR "exited with ALARM\n";
       exit;
    };
    alarm 30; # try half a minute
    ...; # do expensive stuff
}

答案 1 :(得分:6)

从Windows命令行,您可以在自己的窗口中首先start perl脚本,使用timeout命令将其链接以等待 x 秒(此处为2)然后使用taskkill命令再次链接它以终止进程。

start perl csv2rrd3.pl & timeout -t 2 & taskkill /IM perl.exe

上面的行会杀死每个perl进程。要仅杀死刚刚开始的游戏,您可以使用自定义窗口标题。

start "KILLME" perl csv2rrd3.pl & timeout -t 2 & taskkill /FI "WINDOWTITLE eq KILLME" /IM perl.exe

答案 2 :(得分:0)

好吧,不确定超时,但你可以等一段特定的时间再杀掉这个过程。

sleep(10) # sleep 10 seconds
kill      # and insert PID of the process (see command ps)

答案 3 :(得分:0)

更新的答案(如果使用PowerShell)

在Powershell中,命令的开始,等待和终止都会发生,这使得它可以用于任何环境,而不仅仅是Peral。

$x = Start-Process -Filepath "ping" -ArgumentList 'google.com -n 100' -NoNewWindow -PassThru; 
Start-Sleep -Seconds 5; 
try { Stop-Process -Id $x.Id -ErrorAction stop } catch {};

ping 和argumnets列表替换为需要运行的内容。

如果您需要早日返回(例如,该过程将在命令完成结束时或者结束,请用循环替换Start-Sleep ...检查$ x.Id是否仍处于活动状态,然后休眠1秒钟。