4

cmdに次のコマンドがあります

perl csv2rrd3.pl

しかし、それは常に長時間実行されます。タイムアウトを設定する方法はありますか? または私はperlスクリプトでそれを行うべきですか?? そしてどうやって?

ありがとう

4

4 に答える 4

8

Perl の内部では、数秒後にアラームが鳴るように設定できます。その後、シグナル ハンドラーを使用してイベントをキャッチできます。一度にアクティブにできるアラームは 1 つだけです

{ # 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スクリプトを連鎖させ、xtimeout秒待機するコマンド(ここでは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と引数リストを実行する必要があるものに置き換えます。

早期復帰が必要な場合 (たとえば、コマンドが終了するかタイムアウトに達したときにプロセスが終了する場合、 $x.Id がまだアクティブなプロセスであるかどうかを確認し、アクティブなプロセスである場合は 1 秒間スリープするループに置き換えます。Start-Sleep ...

于 2019-12-18T18:38:18.157 に答える