cmdに次のコマンドがあります
perl csv2rrd3.pl
しかし、それは常に長時間実行されます。タイムアウトを設定する方法はありますか? または私はperlスクリプトでそれを行うべきですか?? そしてどうやって?
ありがとう
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
}
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
タイムアウトについてはわかりませんが、特定の時間待ってからプロセスを強制終了できます。
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と引数リストを実行する必要があるものに置き換えます。
早期復帰が必要な場合 (たとえば、コマンドが終了するかタイムアウトに達したときにプロセスが終了する場合、 $x.Id がまだアクティブなプロセスであるかどうかを確認し、アクティブなプロセスである場合は 1 秒間スリープするループに置き換えます。Start-Sleep ...