2016-08-03 3 views
0

Я написал программу индексирования в Java, что мне нужно работать «как можно чаще» на машине Windows, т.е.Перезапустите программу на Windows, каждый раз, когда он закончил

  1. Когда программа закончена, его следует перезапустить.
  2. Когда программа работает дольше одного часа, ее следует убить и перезапустить.

Я думал о написании Java-программы, которая «работает вечно», но иногда JVM аварийно завершает работу, поэтому этот подход не кажется надежным.

Я предполагаю, что мне нужно написать командный файл или сценарий Powershell, но на самом деле не знаю с чего начать.

+1

Службы имеют возможность автоматического перезапуска при сбое. Так вот что я буду делать: напишите «бесконечную» программу и оберните ее в службу. Конфигурируйте последнюю, чтобы она была обнаружена при ошибке. Если это вариант. – Fildor

+1

Повторяющийся процесс индексации «как можно чаще» звучит немного ... трудоемкий. Вы уверены, что это лучший подход? Как насчет запланированной задачи для запуска индексатора на регулярной основе? – vonPryz

+0

* В Windows * будет реализован небольшой сервис, который запускает, контролирует и перезапускает приложение. Ниже приведена подробная статья о том, как это сделать: https://msdn.microsoft.com/en-us/magazine/mt703436.aspx - Извините, что не могу написать anwser с этим, но ссылка только одна нахмурились , и содержимое слишком велико, чтобы соответствовать одному единственному ответу –

ответ

0

Вы можете попробовать поиграть с таймера объекта, например:

$filepath = 'C:\Windows\System32\calc.exe' #change this to your exe location 
$exe = 'calc' #change this to your exe process name 

$Timer = New-Object System.Timers.Timer 
$Timer.Interval = 1000 #interval in ms 
$Timer.Enabled = $true 
$Action = { 
    $process = Get-Process $exe 
    if ($process) 
    { 
     if ((New-TimeSpan -Start $process.StartTime -End (Get-Date)) -gt ([timespan]'00.01:00:00')) #this timespan equals to 1 hour 
     { 
      Get-Process $exe | Stop-Process -Force 
     } 
    } 
    else 
    { 
     Start-Process -FilePath $filepath 
    } 
    $process = $null 
} 
[void](Register-ObjectEvent -InputObject $Timer -EventName elapsed –SourceIdentifier Timer123456 -Action $Action) 
$Timer.Start() #to start timer 
#$Timer.Stop() #to stop timer 

Вы можете затем запустить его в фоновом режиме, и она будет взглянуть на процесс вы хотите.

Хотя вам нужно убедиться, что у него есть уникальное имя процесса.