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

25624
Sid

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

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

10
Какой тип приложения и как оно нормально запускается? Как служба, в реестре как команда запуска или в папке автозагрузки? KCotreau 13 лет назад 0
Реестр запускает команду. с опцией '-start'. Sid 13 лет назад 0
Что в настоящее время происходит, если вы снова запустите эту команду с уже запущенным приложением? KCotreau 13 лет назад 0
ничего такого. Команда распознает, что приложение уже запущено. Sid 13 лет назад 0

5 ответов на вопрос

9
sgmoore

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

@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 8 лет назад 0
Спасибо!! Небольшое копирование и вставка в 12:52, и я могу заснуть без (слишком много) беспокойства о том, что я найду (или не найду) утром. Э-э. утром после сна. Spike0xff 7 лет назад 0
2
KCotreau

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

Это кажется мне довольно неуклюжим и неэффективным решением, хотя и быстрым. Возможно, есть более подходящие средства для той же цели? Спасибо за вашу помощь!!! Sid 13 лет назад 0
Сид, как я уже сказал, накладные расходы ОЧЕНЬ минимальны, и это легко сделать. Если вы хотите найти способ кодирования чего-либо, чтобы проверить, работает ли он, а затем перезапустить его, не стесняйтесь, но я уже давно занимаюсь этим с положительными результатами. Это распространенный метод, используемый, когда у вас есть приложения, обычно на сервере, которые перестают работать. KCotreau 13 лет назад 0
Безусловно самый простой метод. И нет накладных расходов. surfasb 11 лет назад 0
2
Steve Mallam

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

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

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

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

I use the computer as a media server and the offending application is mediaserver.exe. Nothing malicious about it. I can't foresee any scenario I'd like the application closed, but if I was to, there'd be no reason I couldn't stop the script or bat first. Also, I'm not capable of writing software, but am familiar with bat files. i.e. I'm a noob. Sid 13 лет назад 0
Извинения - я бы подумал, что я в группе "Программисты", а вы сами написали приложение :-) Неуклюже, как кажется, я бы предложил подход "запланированного задания", описанный @KCotreau Steve Mallam 13 лет назад 0
1
Saxtus

You can use a program called ReStartMe 2.0 that does exactly that:

Monitors for processes and restarts them if they close.

-1
Rottweiler Games

это намного лучше! этот код, который я использовал для игрового сервера, должен быть сохранен в файле .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)