4

我在cmd中只有以下命令

perl csv2rrd3.pl

但它总是运行很长时间。有没有办法为它设置超时?或者我应该在 perl 脚本中执行它?如何?

谢谢

4

4 回答 4

8

在 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
}
于 2012-12-05T10:15:37.710 回答
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
于 2012-12-05T10:26:35.970 回答
0

好吧,不确定超时,但你可以等待一些特定的时间,然后终止进程。

sleep(10) # sleep 10 seconds
kill      # and insert PID of the process (see command ps)
于 2012-12-05T10:11:20.440 回答
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 秒。

于 2019-12-18T18:38:18.157 回答