Автоматически перезапускать приложение при закрытии


10

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

Есть ли bat или скрипт, который я могу запустить, чтобы контролировать приложение и перезапустить его, если оно закроется?


Какой тип приложения и как оно нормально запускается? Как служба, в реестре как команда запуска или в папке автозагрузки?
Котро

Реестр запускает команду. с опцией '-start'.
Сид

Что в настоящее время происходит, если вы снова запустите эту команду с уже запущенным приложением?
Котро

ничего. Команда распознает, что приложение уже запущено.
Сид

Ответы:


12

Это не всегда работает (это зависит от того, как программа загружается сама), но обычно вы можете создать командный файл следующим образом:

@Echo off
:Start
NotePad
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

goto Start

Я использовал Блокнот в качестве примера.

Линии

echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

Это просто задержка (10 секунд), чтобы дать пользователю возможность прервать процесс до его повторного запуска.

Линия

echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 

не требуется, но будет регистрировать каждый раз, когда программа была закрыта для файла, поэтому может быть полезно диагностировать проблему. ErrorLevel может не сказать вам много, но программа должна возвращать 0, если она нормально закрылась, и не нулевое сообщение, если оно не

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


msgstr "тогда пакет будет зацикливаться и пытаться запускать вашу программу каждые десять секунд." Это плохо?
posfan12

Спасибо!! Небольшое копирование и вставка в 12:52, и я могу заснуть без (слишком много) беспокойства о том, что я найду (или не найду) утром. Э - э. утром после сна.
Spike0xff

2

Исходя из ваших ответов выше, я предлагаю вам поместить эту команду в пакетный файл, а затем настроить этот пакетный файл для запуска в качестве запланированной задачи каждую минуту. С этим практически не связано никаких накладных расходов, и это гарантирует, что ваш процесс будет заявлен независимо от того, собираетесь ли вы даже осознать, что он остановлен.


Это кажется мне довольно неуклюжим и неэффективным решением, хотя и быстрым. Возможно, есть более подходящие средства для той же цели? Спасибо за вашу помощь!!!
Сид

Сид, как я уже сказал, накладные расходы ОЧЕНЬ минимальны, и это легко сделать. Если вы хотите найти способ кодирования чего-либо, чтобы проверить, работает ли он, а затем перезапустить его, не стесняйтесь, но я давно этим занимаюсь с положительными результатами. Это распространенный метод, используемый, когда у вас есть приложения, обычно на сервере, которые перестают работать.
Котро

Безусловно самый простой метод. И нет накладных расходов.
Surfasb

2

Я думаю, правильный ответ на этот вопрос зависит от того, почему вы хотите это сделать. Вы пытаетесь решить случайное отключение? Предотвратить случайное «злонамеренное» отключение пользователями машины (например, сотрудниками, закрывающими программное обеспечение для мониторинга)? Предотвратить серьезную и квалифицированную злонамеренную атаку? Вы пытаетесь писать вредоносные программы самостоятельно (в этом случае, пожалуйста, отключитесь ;-))?

Кроме того, как упоминали другие комментаторы, было бы иначе, если бы вы написали службу Windows (например)

Лично я бы, вероятно, начал с написания второго приложения и запуска его таким же образом. Пусть оба приложения периодически сканируют друг друга и, при необходимости, перезагружаются - убедитесь, что вы предоставляете простой способ для законного закрытия приложения!

Тем не менее, и учитывая ваш комментарий «иногда я обнаружу, что он закрылся сам по себе», я бы НАЧИНАЛ вначале, пытаясь выяснить, почему он закрыт ...


Я использую компьютер в качестве медиасервера, а приложение-нарушитель - mediaserver.exe. Ничего плохого в этом нет. Я не могу предвидеть ни одного сценария, по которому я бы хотел закрыть приложение, но если бы я это сделал, не было бы причины, по которой я не смог бы сначала остановить сценарий или биту. Кроме того, я не умею писать программы, но знаком с файлами bat. т.е. я нуб.
Сид

Извинения - я бы подумал, что я в группе "Программисты", а вы сами написали приложение :-) Неуклюже, как это звучит, я бы предложил подход "запланированного задания", описанный @KCotreau
Steve Mallam

2

Вы можете использовать программу под названием ReStartMe 2.0 [ Mirror ] делает именно это:

Отслеживает процессы и перезапускает их, если они закрываются.


-1

это намного лучше! этот код, который я использовал для игрового сервера, должен быть сохранен в файле .bat

@echo off
rem This is a comment line
rem This one is a comment too
rem Following line ensures the working directory is searched in C:
C:
rem Join the correct directory, where the server stuff lies in:
cd "C:\Users\morenavaj\Documents\minetest-0.4.16-win64 - Lone_Wolf\"
:love_spaghetti_code
bin\server.lnk --config minetest.conf ^
            --worldname "Land of Blockheads" ^
            --gameid minetest_game ^
            --port 30000 ^
            --logfile bin/debug.txt

echo Restarting server....
goto love_spaghetti_code

echo Done (this should never, ever, happen)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.