我在cmd中只有以下命令
perl csv2rrd3.pl
但它总是运行很长时间。有没有办法为它设置超时?或者我应该在 perl 脚本中执行它?如何?
谢谢
在 Perl 内部,您可以设置闹钟在几秒钟后响起。然后,您可以使用信号处理程序来捕获事件。任何时候只能激活一个警报
{ # 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
}
在 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
好吧,不确定超时,但你可以等待一些特定的时间,然后终止进程。
sleep(10) # sleep 10 seconds
kill # and insert PID of the process (see command ps)
如果 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 秒。