Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2021 11:26:18

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

Скрипт подключается к MariaDB после загрузки сервера и висит как фоновый процесс в памяти до следующей перезагрузки. Он содержит только 1 функцию period(), которая апдейтит значение в БД и перезагружает сервер дважды в сутки: в полночь и в полдень.

Мой скрипт запускается через crontab таким образом:

 @reboot sleep 90 && /root/bin/Period.py > ~/skript.log 2>&1

После ребута видно процесс в памяти:
 1898 ?        S      0:00 /usr/bin/python3.8 /root/bin/Period.py

Содержимое скрипта
 #!/usr/bin/python3.8
import pymysql
import sys
from time import sleep
import datetime
import os
try:
    conn = pymysql.connect(
        user="username",
        password = "passwd",
        host = "hostname",
        port = 3306,
        database = "db"
    )
except Exception as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)
cur = conn.cursor()
def period():
    try:
        sleep(3600)
        while True:
            now = datetime.datetime.now()
            now = now.hour
            if int(now) == 0:
                cur.execute("SELECT * FROM `permissions`")
                base = cur.fetchall()
                i = 0
                lan = len(base)
                while i < lan:
                    period = int(base[i][4]) - 1
                    if int(period) >= 0:
                        cur.execute("UPDATE `permissions` SET `period`='" + str(period) + "' WHERE `userID`='" + str(base[i][1])+"'")
                        conn.commit()
                        sleep(2)
                        cur.close()
                        conn.close()
                    i += 1
                os.system("reboot")
            elif int(now) == 12:
                os.system("reboot")
            sleep(60)
    except Exception as e:
        print(e)
period()


При этом в логе
 # cat ~/skript.log
Cursor closed

Дата создания лога - полночь.

Сразу после ребута сервера скрипт видно в списке процессов и лог ~/skript.log пустой.

Я подозреваю, что возможно проблема в параметрах MariaDB или в самом скрипте. Увеличил значение таймаутов для БД (24 часа) в /etc/mysql/mariadb.conf.d/50-server.cnf:
 wait_timeout        = 86400
interactive_timeout = 86400

но скрипт продолжает слетать после какого-то количества часов и его не видно в списке процессов.

Отредактировано ffrr (Янв. 17, 2021 11:26:52)

Офлайн

#2 Янв. 17, 2021 14:32:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4049
Репутация: +  247  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

Первое что приходит в голову - используйте модуль logging вместо print и задублируйте вывод лога в файл.
Ну и залоггируйте все основные действия.
Все сразу станет понятнее.

 type(datetime.datetime.now().hour)
<class 'int'>
так что все ваши int(now) это масло масляное.



Офлайн

#3 Янв. 18, 2021 04:15:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 7953
Репутация: +  727  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

ffrr
Скрипт подключается к MariaDB после загрузки сервера и висит как фоновый процесс в памяти до следующей перезагрузки. Он содержит только 1 функцию period(), которая апдейтит значение в БД и перезагружает сервер дважды в сутки: в полночь и в полдень.
У тебя архитектурно всё смешано в свалку.

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

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

И дальше у тебя должен быть третий скрипт, который запускает второй скрипт, чтобы тот начал периодично это всё делать (он сам знает, что ему делать). И вот в этот третий скрипт ты засовываешь эту паузу в начале, что он там должен что-то подождать. И у него может быть лог свой, а может не быть лога. Но лучше сделать лог.

И вот этот третий скрипт ты присоединяешь к cron'у без всяких временных заморочек. Чем проще, тем лучше. В идеале - просто запуск при загрузке системы.

И дальше ты сидишь и смотришь логи. А логи все принадлежат соответствующим скриптам и включают все подробности по каждому вопросу.

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



Отредактировано py.user.next (Янв. 18, 2021 04:16:21)

Офлайн

#4 Янв. 18, 2021 08:57:08

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

doza_and
now = datetime.datetime.now()
а у меня так:
 >>> print(type(datetime.datetime.now().hour))
<class 'int'>
>>> print(type(now))
<class 'datetime.datetime'>

Офлайн

#5 Янв. 18, 2021 08:59:29

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

py.user.next
спасибо, пожалуй Ваш алгоритм получше будет и понагляднее. Теперь надо подумать как же его реализовать))

Офлайн

#6 Янв. 18, 2021 10:34:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 7953
Репутация: +  727  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

ffrr
Теперь надо подумать как же его реализовать
Используй Shell-скрипты. На них это всё быстро делается. А питон - чисто для записи в базу данных.

ABSG на английском
https://tldp.org/LDP/abs/abs-guide.pdf

ABSG на русском
http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html
ABSG на русском в html
https://nklug.org.ua/lg/rus/articles/index-abs-guide.html


tags: bash shell



Отредактировано py.user.next (Янв. 18, 2021 10:45:05)

Офлайн

#7 Янв. 18, 2021 10:51:51

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

py.user.next
Используй shell-скрипты. На них это всё быстро делается. А питон - чисто для записи в базу данных.
спасибо, возможно мне так действительно легче будет реализовать с помощью shell скриптов в том числе…

Офлайн

#8 Июль 4, 2021 15:02:00

Bonbrubon
Зарегистрирован: 2021-05-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

скрипт перестает висеть в памяти после какого-то периода времени

Опишите пожалуйста, справились ли вы и как же все таки удобнее ?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version