В Linux има timeout
команда, която има много хубав и прост синтаксис:
timeout 120 command [args]
Просто е.Той изпълнява командата и я убива, ако командата работи по време. Въпреки най-добрите ми усилия, "решенията" в прозорците са множество редове, не показвайте изхода на командата на терминала и cygwin "timeout" не успя да убие процеса, ако увеличих времето за изчакване на повече от една минута (I нямат обяснение за това). Някой има ли по-добра идея?
Отговори:
2 за отговор № 1Искам да кажа, че има timeout.exe
но не мисля, че ви дава съвсем същата функционалност, която търсите.
Не съм наясно с a timeout
еквивалент за Windows. Следвайки предложението в свързан отговор Работните места в PowerShell биха били предложение как да се репликира timeout
s поведение. Въртях проста примерна функция
function timeout{
param(
[int]$Seconds,
[scriptblock]$Scriptblock,
[string[]]$Arguments
)
# Get a time stamp of before we run the job
$now = Get-Date
# Execute the scriptblock as a job
$theJob = Start-Job -Name Timeout -ScriptBlock $Scriptblock -ArgumentList $Arguments
while($theJob.State -eq "Running"){
# Display any output gathered so far.
$theJob | Receive-Job
# Check if we have exceeded the timeout.
if(((Get-Date) - $now).TotalSeconds -gt $Seconds){
Write-Warning "Task has exceeded it allotted running time of $Seconds second(s)."
Remove-Job -Job $theJob -Force
}
}
# Job has completed natually
$theJob | Remove-Job -ErrorAction SilentlyContinue
}
Това стартира работа и продължава да проверява за нейния изход. Така че трябва да се доближите до актуализациите на текущия процес. Не е нужно да използвате -ScriptBlock
и биха могли да изберат -Command
базирани работни места. Ще покажа пример, използвайки горната функция и скриптов блок.
timeout 5 {param($e,$o)1..10|ForEach-Object{if($_%2){"$_`: $e"}else{"$_`: $o"};sleep -Seconds 1}} "OdD","eVeN"
Това ще отпечата числата от 1 до 10, както иравномерността на числата. Между показването на число ще има пауза от 1 секунда. Ако времето за изчакване е достигнато, се показва предупреждение. В горния пример всички 10 числа няма да бъдат показани, тъй като процесът е разрешен само 5 секунди.
Функцията може да използва някои докосвания и вероятно има някой, който може вече да е направил това. Моето мнение е поне.