Автоматический перезапуск программы при ошибке

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

Компенсировать этот недостаток может Restart on Crash — небольшая портативная бесплатная утилита, предназначенная для автоматического перезапуска сбойных и зависших процессов. Находясь в активном состоянии, она отслеживает статус добавленных в её список приложений и перезапускает их, если по какой-то причине они перестают отвечать или завершаются некорректно. Restart on Crash имеет легкий интерфейс и минимум настроек, посему взята она может быть на вооружения даже начинающими пользователями.

Restart on Crash

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

Запустив утилиту, нажмите кнопку «Add» и выберите в открывшемся окне нажатием кнопки «Select a file» исполняемый файл приложения, процесс которого намереваетесь отслеживать. Также вы можете нажать «Select a running application».

Restart on Crash

И выбрать приложение из списка запущенных процессов, однако будьте осторожны, так как в нём перечислены и процессы в самой Windows. Если не знаете, за что отвечает тот или иной процесс, лучше не трогайте его.

Restart on Crash

В этом же окошке можно задать настройки мониторинга, например, указать утилите, при выполнении каких условий проблемный процесс должен быть перезапущен: когда он не отвечает или же когда он внезапно падает. Можно задать время повторной проверки отклика зависшего процесса, а также уточнить действие, которое должно будет выполняться после падения сбойного приложения. Доступны принудительное завершение процесса (если окно закрыто, а сам процесс еще висит), закрытие всех не отвечающих процессов и выполнение определенную команды.

Restart on Crash

Когда Restart on Crash обнаруживает, что приложение не отвечает или не работает, он ждёт 60 секунд (это время по умолчанию), а затем перезапускает его. Restart on Crash хорошо показал себя с десктопными программами, чего нельзя сказать об универсальных приложениях. Работу с некоторыми из них он поддерживает, с некоторыми нет. И ещё. Утилита предназначается исключительно для перезапуска приложений, она не сохраняет никаких результатов их работы и уж тем более не создает снапшотов состояния.

Сайт разработчика: w-shadow.com/blog/2009/03/04/restart-on-crash

Загрузка…

Рассмотрим, как с помощью PowerShell проверить, запущено ли определенное приложение или процесс, как автоматически перезапустить его при сбое, если его случайно закрыл пользователь или он стал утекать (использовать слишком много оперативной памяти).

Ранее мы показывали, как с помощью PowerShell можно управлять процессами Windows. Чтобы проверить, запущен ли процесс notepad.exe и перезапустить его, можно использовать такой скрипт.

If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe

}

Можно автоматически перезапустить процесс, если он не отвечает (завис) или если он стал использовать слишком много оперативной памяти (в этом примере более 500 Мб):

$proc = Get-Process -Name notepad| Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 500000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}

С помощью for можно сделать бесконечный цикл, который запускает процесс, каждые 60 секунд проверяет что он запущен и перезапускает его, если нужно:

for(;;)
{

try
{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
If (!$proc -or ($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 200000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}
}
catch
{
}
Start-sleep -s 60
}

powershell как перезапустить процесс или приложение, если его закрыли или оно зависло

Если нужно проверить состояние процесса на удаленных компьютерах, можно использовать команду:

$proc = Get-Process -ComputerName PC01 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue

Для удаленного запуска процесса можно использовать Invoke-Command:

Invoke-Command -ComputerName PC01 -Credential $Cred -ScriptBlock {Start-Process C:\Windows\notepad.exe -wait -verb runas;}

Вы можете запустить этот PowerShell скрипт в виде логон скрипта GPO при входе пользователя.

В этом случае нужно сохранить PowerShell код в файле с расширением PS1. Можно подписать этот скрипт цифровой подписью, изменить настройки политики запуска PowerShell скриптов, или запускать его с параметром
–ExecutionPolicy Bypass
.

  • Имя запускаемого файла:
    %windir%\System32\WindowsPowerShell\v1.0\powershell.exe
  • Параметры запуска:
    -windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1

Также можно запускать PS1 скрипт по расписанию с помощью задания планировщика. Используйте аналогичные параметры запуска. Дополнительно можно указать учетную запись пользователя, от имени которого запускать процесс.

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%\CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "aaivanov" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $Task

Либо этот PowerShell скрипт можно запускать в виде службы Windows

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

The program is like this:

HEADER CODE
urllib2.initialization()
try:
    while True:
        urllib2.read(somebytes)
        urllib2.read(somebytes)
        urllib2.read(somebytes)
        ...
except Exception, e:
    print e
FOOTER CODE

My question is when error occurs (timeout, connection reset by peer, etc), how to restart from urllib2.initialization() instead of existing main program and restarting from HEADER CODE again?

asked Oct 23, 2009 at 3:36

jack's user avatar

You could wrap your code in a «while not done» loop:

#!/usr/bin/env python

HEADER CODE
done=False
while not done:
    try:
        urllib2.initialization()
        while True:
            # I assume you have code to break out of this loop
            urllib2.read(somebytes)
            urllib2.read(somebytes)
            urllib2.read(somebytes)
            ...
    except Exception, e:    # Try to be more specific about the execeptions 
                            # you wish to catch here
        print e
    else:
    # This block is only executed if the try-block executes without
    # raising an exception
        done=True
FOOTER CODE

answered Oct 23, 2009 at 3:46

unutbu's user avatar

unutbuunutbu

845k184 gold badges1787 silver badges1678 bronze badges

How about just wrap it in another loop?

HEADER CODE
restart = True
while restart == True:
   urllib2.initialization()
   try:
       while True:
           restart = False
           urllib2.read(somebytes)
           urllib2.read(somebytes)
           urllib2.read(somebytes)
           ...
   except Exception, e:
       restart = True
       print e
FOOTER CODE

answered Oct 23, 2009 at 3:41

Charles Ma's user avatar

Charles MaCharles Ma

47.2k22 gold badges88 silver badges101 bronze badges

Simple way with attempts restrictions

HEADER CODE
attempts = 5
for attempt in xrange(attempts):
    urllib2.initialization()
    try:
        while True:
            urllib2.read(somebytes)
            urllib2.read(somebytes)
            urllib2.read(somebytes)
            ...
    except Exception, e:
        print e
    else:
        break
FOOTER CODE

answered Oct 23, 2009 at 6:44

Andrey Gubarev's user avatar

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

Нужна софтина, которая умеет мониторить наличие запущенного процесса, и при его отсутствии через определённое время запускать его заново.

Windows XP, если это имеет значение.


  • Вопрос задан

  • 22825 просмотров

Пригласить эксперта

Второй вариант — в sheduled task создать задачу с этим приложением, выполняться каждую минуту, duration по максимуму, не завершать в случае, если задача еще выполняется.

pslist.exe -e «процесс»
if %errorlevel%==1 start «» «программа»

pslist входит в состав pstools, качается с майкрософтофского технета

Если не запускается как служба.
«и при его отсутствии через определённое время» — это сколько?
1) Минуты — WSH в помощь, определить наличие процесса в выводе tasklist и запустить его. В качестве расписания использовать стандартный планировщик. Мануалов в сети куча
2) Секунды — то или искать готовый watchdog, или писать самому. Тоже проблемы особой нет.

Код На vbscript слепленный из 2 примеров:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcesses
Wscript.quit
Next

Error = objWMIService.Create("notepad.exe", null, null, intProcessID)
If Error = 0 Then
Wscript.Echo "Notepad was started with a process ID of " _
& intProcessID & "."
Else
Wscript.Echo "Notepad could not be started due to error " & _
Error & "."
End If


  • Показать ещё
    Загружается…

21 сент. 2023, в 22:23

5000 руб./за проект

21 сент. 2023, в 20:54

10000 руб./за проект

21 сент. 2023, в 20:40

20000 руб./за проект

Минуточку внимания

Одной из важнейших задач при разработке серверных частей API или Ботов, обрабатывающих различные оповещения, является обеспечение их бесперебойной работы. Иными словами, необходимо автоматизированно произвести запуск всех необходимых скриптов при перезагрузке системы и перезапуск в случае ошибок и падений.

Одним из главных иструментов является supervisor.

Для установки достаточно набрать следующую команду в терминале (считаем что менеджер пакетов pip у вас уже уставнолен. Как это сделать читайте в статье Создаем бота для telegram).

sudo pip install supervisor

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

/etc/supervisor/supervisord.conf

Удалим все содержимое и впишем следующий текст:

[program:github_server]
command=python server.py
directory=/var/www/codex.bot/
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/codex.bot/logs/app_sd.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn

В примере мы указываем, что хотим обеспечить контроль скрипта server.py, находящегося в директории /var/www/codex.bot и уточняем еще пару настроек логирования ошибок. Если супервизор у вас еще не запущен, выполните команду:

supervisord

Теперь можно попросить супервизор прочитать данные из конфига:

supervisorctl reread

Для просмотра статуса запущенных процессов воспользуйтесь командой:

supervisorctl status

Процесс под названием “github_server” (название указывается в конфиге) будет находится в состоянии “STOPPED”.

Запустим его:

supervisorctl start

Теперь в статусе будет отображено состояние “RUNNING”. Для остановки процесса можно пользоваться командой:

supervisorctl stop

Наконец, если принудительно завершить процесс:

sudo killall python

Он все равно будет перезапущен супервизором:

Состояние до завершения: github_server RUNNING pid 21755, uptime 0:03:57
Состояние после завершения: github_server RUNNING pid 21929, uptime 0:00:01

Видно, что сервер был перезапущен. Более подробно можно почитать в официальной документации.

Понравилась статья? Поделить с друзьями:
  • Автоматические знаки препинания и исправление ошибок
  • Автомагнитола пионер выдает ошибку 23 при флешке
  • Автономка аэрокомфорт 4квт коды ошибок
  • Автоматически исправлять системные ошибки на флешке
  • Автоматические двери тормакс ошибка е30