10

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

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

5 ответов5

10

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

@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, если она нормально закрылась, и не нулевое сообщение, если оно не

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

2

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

2

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

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

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

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

1

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

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

-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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .