Renaldas
Фев. 2, 2021 21:08:39
Я новичок в питоне, в детстве интересовался только бейсиком, немного программировал на нем и на лингвистически похожих языках или в программах, поэтому питон мне исключительно неинтуитивен по всему, что возможно.
Я так сяк написал на нем простую программку для работы моих майнеров, которая регулирует их поведение в зависимости от условий рынка. Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит. Я ее вручную перезапускаю, и опять несколько часов все нормально.
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается. Углубляться в то, почему и какие там ошибки вылетают, опять же, я на данный момент не хочу, так как банальный перезапуск программы все решает.
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно было сделать простой галочкой или парой строк?
Питон на Pycharm на винде 10.
Посоветуйте простое решение.
py.user.next
Фев. 2, 2021 23:38:16
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.
doza_and
Фев. 2, 2021 23:44:11
Renaldas
Неужели так сложно перезапустить программу, то, что в некоторых других оболочках можно
Причем тут питон??? Ваша оболочка windows 10. Вот для него и гуглите как запустить процесс как службу.
PEHDOM
Фев. 3, 2021 12:00:16
Renaldas
Я часа 3 провел гуугля как можно автоматически сделать перезапуск, но ума сделать что-то рабочее мне не получается.
Тут нужно понимать откуда вы хотите “автоматически сделать перезапуск”и как вы его запускаете?
вот такой примитивный скрипт запускает сам себя после завершения .
import sys
import os
import time
python = sys.executable
print('hello World!!')
time.sleep(5)
print('work finished')
os.execl(python, python, * sys.argv)
другой вариант, вам уже предложил
py.user.next создать скрипт который будет запускать, например, через subprocess(или както по другому, сейчакс это не имеет принципиальной роли) ваши скрипты, и контролировать, если процесс завершен запускать его еще раз.
xam1816
Фев. 3, 2021 14:46:22
Renaldas
Проблема та, что время от времени сайт, с которого я получаю данные либо виснет, либо дает какие-то неправильные данные, и программа останавливается и выходит
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except. Функция работает в возвращает код работоспособности, как у реквест, если ошибка,то далее алгоритм который через сколько то времени пробует запускать функцию.,и ещё смс уведомление или включение сирены гражданской обороны
doza_and
Фев. 3, 2021 21:30:32
xam1816
Я представлял это,как функция в которой рабочий скрипт обернутый в try ,except.
Случаи бывают разные. Скрипт может сожрать всю допустимую для процесса память, Наоткрывать файловых дескрипторов сверх лимита. Те прийти в состояние когда данный процесс однозначно не может дальше жить. try except не спасет отца русской демократии.
Вот для этих случаев и есть службы. операционка позаботится чтобы процесс воскрес.
Бывают и более жесткие случаи, когда процессы циклятся или операционная система становится нестабильна, на это есть вотчдог таймеры…
py.user.next
Фев. 3, 2021 22:06:05
PEHDOM
другой вариант, вам уже предложил py.user.next создать скрипт который будет запускать
Это монитор. Шаблон такой архитектурный. В Erlang'е есть такие, благодаря чему он отказоустойчивый и широко используется в телекоме, где кучи всяких устройств с аппаратными ошибками, нестабильным электричеством и прочим. В Erlang'е изначально много легковесных параллельных процессов можно запускать и они независимы - действуют сами по себе, поэтому там есть средства для работы с ними и всё устроено удобно в этом плане. Вот такой процесс может грохнуться в результате чего-нибудь - свет отрубили, например. И чтобы ничего не менять в нём, так как он исправен и там просто с аппаратурой что-то, придумали вот эти процессы-мониторы, которые следят за обычными процессами и перезапускают их по новой, если те падают. Так там надёжность обеспечивается. И эта модель отлажена уже десятилетиями.
Renaldas
Фев. 4, 2021 22:57:39
py.user.next
Тебе надо написать второй скрипт B, который запускает первый скрипт A и следит за ним. Если скрипт A выпал, то скрипт B его перезапускает. Скрипт B можно писать на питоне, а можно на другом языке.
Да, я этот вариант понял и провел какой час спрашивая у гуугла, как это сделать, но пока что моих знаний не хватило. Я пробовал определить PID первого процесса и во втором скрипте задать проверку, есть ли такой процесс, но “завалил” дело на банальном - не смог понять, как другому скрипту передать величину переменной (PID) из первого.
PEHDOM
Фев. 5, 2021 09:15:30
Renaldas
но “завалил” дело на банальном - не смог понять, как другому скрипту передать величину переменной (PID) из первого.
Обычно первый процесс(котороый нужно мониторить), в заранее определенном месте, создает файл, в который при запуске помещает свой pid. При штатном завершении он этот файл удаляет/очищает. Второй процесс смотрит если файла нет или он пустой, значит процесс не запускали или штатно остановили, если там есть pid то смотрит в процессах, и если не находит процесса с таким pid то значит процесс завершился аварийно, и нужно его перезапустить.
xam1816
Фев. 5, 2021 11:24:58
вот так баловался с блокнотом,выключал его,он через 5 сек запускался
import subprocess
import time
notepad = subprocess.Popen('C:\\Windows\\System32\\notepad.exe')
while True:
if notepad.poll() != None:
time.sleep(5)
print('перезапуск')
notepad = subprocess.Popen('C:\\Windows\\System32\\notepad.exe')
не знаю на сколько он эффективен,не вникал
А так наверное на винде процесс можно запустить через службу,которая при падении будет его перезапускать