我在cmd中只有以下命令
perl csv2rrd3.pl
但它总是运行很长时间。 有没有办法为它设置超时? 或者我应该在perl脚本中做到这一点?怎么样?
由于
答案 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秒钟。