Как автоматически перезапустить программу, если она зависает в Windows? - PullRequest
9 голосов
/ 18 февраля 2012

Как я могу запустить мою программу автоматически, если она падает на сервере Windows 2003?Иногда моя программа просто падает, есть ли способ в windows или настройках, которые я могу установить?

Ответы [ 6 ]

9 голосов
/ 19 февраля 2012

Обычный подход заключается в запуске процесса, известного как guardian .Это отдельный процесс, часто служба, которая контролирует состояние основного процесса.Когда хранитель обнаруживает, что основной сервис умер, он снова его запускает.

Насколько я знаю, в Windows нет встроенных функций, которые могли бы сделать это для вас.

6 голосов
/ 01 мая 2013

Обратите внимание: запуск самозапускающихся файлов bat может быть полезен, но если вы не знаете, что делаете, они могут нанести всевозможные разрушения. Это особенно важно, если вы запускаете их при запуске. Вы были предупреждены.

В любом случае. Я только что вспомнил кое-что из моих 286 дней, когда я много играл с BAT-файлами. Если вы напишите файл

yourprogram.exe
some other event

BAT-файл запустит вашу программу, а затем приостановит работу и подождет в фоновом режиме, пока программа не закроется. После этого будет запущено «какое-то другое событие». Раньше это раздражало, если вы хотели запускать несколько вещей одновременно, но здесь это действительно полезно. Используя это, можно заставить его запустить цикл, который перезапускает программу (и повторно запускает файл bat), как только он выходит. Объедините это с https://superuser.com/questions/62525/run-a-completly-hidden-batch-file,, и вы даже никогда не увидите, что это происходит.

Окончательный BAT-файл (в данном примере «restart.bat») будет выглядеть примерно так:

c:\[location]\yourprogram.exe
wscript "C:\[location]\invisible.vbs" "C:\[location]\restart.bat"

Вот и все. Запустите программу (при запуске через задачу или даже из папки автозагрузки) со строки 2, и это должно решить вашу проблему:)

О, если вы хотите остановить цикл, просто переименуйте файл bat или поставьте «//» перед двумя строками, сохраните его и выйдите из программы.

Если программе, которую вы запускаете, требуются права администратора, решение, которое я нашел, было использовать psexec (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx) для запуска как программы, так и bat с повышенными привилегиями. В этом случае BAT будет выглядеть так:

c:\[location]\psexec -h c:\[location]\yourprogram.exe
c:\[location]\psexec -h wscript "C:\[location]\invisible.vbs" "C:\[location]\restart.bat"

Затем вы запускаете bat как администратор или запускаете вторую строку (без части psexec) из планировщика задач с повышенными привилегиями. ВНИМАНИЕ: запуск его как обычного пользователя и нажатие «нет» в приглашении UAC дало мне BSOD, возможно потому, что он зациклился «не может запустить программу из-за отсутствия привилегий» пару миллиардов раз или что-то в этом роде:)

2 голосов
/ 08 мая 2017

Я искал что-то подобное.Есть два варианта, чтобы справиться с этим - либо вы можете написать небольшой скрипт самостоятельно, либо использовать что-то, что уже существует.

После некоторого поиска в Google я наткнулся на этот прекрасный список .Блоггер собрал около 8 инструментов для автоматического перезапуска сбойного или закрытого приложения.

1 голос
/ 23 декабря 2017

Вы можете использовать RegisterApplicationRestart.

"Если вы регистрируетесь для перезапуска, и приложение обнаруживает необработанное исключение или не отвечает, пользователю предлагается возможность перезапустить приложение; приложение не автоматически перезагружается без согласия пользователя. «

Для автоматического перезапуска без вмешательства пользователя также существует RestartOnCrash . Работает со всеми версиями Windows.

1 голос
/ 10 мая 2012

Вы можете использовать какое-то специальное приложение, такое как BDV SystemEvents или любое другое. Это позволяет вам указать приложение, которое будет запущено, если другое приложение будет закрыто. Укажите то же приложение, что и Условие, и Действие, и вы получите ожидаемые результаты.

1 голос
/ 19 февраля 2012

К сожалению, в Windows нет настроек для автоматического перезапуска обычной программы при ее сбое.

Вам нужно активно взаимодействовать с графическим интерфейсом вашего приложения? Некоторые из Service Wrappers (предназначенные для запуска любого приложения в качестве службы Windows) будут отслеживать ваше приложение и перезапускать его в случае сбоя, но обязательно изучите Изоляция сеанса 0 , чтобы убедиться, что оно не будет мешать.

...