Perl 如何设置cmd命令的超时?

Perl 如何设置cmd命令的超时?,perl,cmd,Perl,Cmd,我只是在cmd中有以下命令 perl csv2rrd3.pl 但它总是运行很长时间。 有没有办法为它设置一个超时? 或者我应该在perl脚本中完成它??怎么做 谢谢嗯,不确定超时时间,但您可以等待特定时间,然后终止进程 sleep(10) # sleep 10 seconds kill # and insert PID of the process (see command ps) start perl csv2rrd3.pl & timeout -t 2 & ta

我只是在cmd中有以下命令

perl csv2rrd3.pl
但它总是运行很长时间。 有没有办法为它设置一个超时? 或者我应该在perl脚本中完成它??怎么做


谢谢

嗯,不确定超时时间,但您可以等待特定时间,然后终止进程

sleep(10) # sleep 10 seconds
kill      # and insert PID of the process (see command ps)
start perl csv2rrd3.pl & timeout -t 2 & taskkill /IM perl.exe

在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命令行,您可以首先在自己的窗口中
启动
perl脚本,使用
timeout
命令将其链接以等待x秒(此处为2),然后使用
taskkill
命令再次链接以终止进程

sleep(10) # sleep 10 seconds
kill      # and insert PID of the process (see command ps)
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

如果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秒。

OP询问
cmd
,这通常是Windows的“shell”。它没有
ps
kill
。在Windows上,您可以使用,它有一个等待()超时方法。它显示错误“此进程只能强制终止”,并且似乎未执行.plyet@DannyHo好的,然后用
/F
,即
taskkill/F/FI“WINDOWTITLE eq KILLME”强制尝试/IM perl.exe
。它在Windows 7 Professional SP1上对我有效。您可以在perl脚本中使用此代码。可能需要太长时间才能运行的部分位于标有省略号的位置。或者您可以编写一个包装器脚本,然后对原始脚本执行
系统
调用;虽然这比较容易,但对于在退出之前执行一些清理(临时文件、连接)的原始脚本。最好从命令行设置报警。然后编写
报警$ARGV[0]//30
或类似代码,其中30是默认值。