Найти - Пользователи
Полная версия: скрипт перестает висеть в памяти после какого-то периода времени
Начало » Базы данных » скрипт перестает висеть в памяти после какого-то периода времени
1
ffrr
Скрипт подключается к 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

но скрипт продолжает слетать после какого-то количества часов и его не видно в списке процессов.
doza_and
Первое что приходит в голову - используйте модуль logging вместо print и задублируйте вывод лога в файл.
Ну и залоггируйте все основные действия.
Все сразу станет понятнее.
 type(datetime.datetime.now().hour)
<class 'int'>
так что все ваши int(now) это масло масляное.
py.user.next
ffrr
Скрипт подключается к MariaDB после загрузки сервера и висит как фоновый процесс в памяти до следующей перезагрузки. Он содержит только 1 функцию period(), которая апдейтит значение в БД и перезагружает сервер дважды в сутки: в полночь и в полдень.
У тебя архитектурно всё смешано в свалку.

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

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

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

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

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

Модуль logging в питоне тебя не спасёт, так как у тебя архитектура неправильная. С неправильной архитектурой своей информационной системы модуль logging будет так же неправильно писать невпопад что-то там куда-то там и по этой информации точно так же ничего не определишь.
ffrr
doza_and
now = datetime.datetime.now()
а у меня так:
 >>> print(type(datetime.datetime.now().hour))
<class 'int'>
>>> print(type(now))
<class 'datetime.datetime'>
ffrr
py.user.next
спасибо, пожалуй Ваш алгоритм получше будет и понагляднее. Теперь надо подумать как же его реализовать))
py.user.next
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
ffrr
py.user.next
Используй shell-скрипты. На них это всё быстро делается. А питон - чисто для записи в базу данных.
спасибо, возможно мне так действительно легче будет реализовать с помощью shell скриптов в том числе…
Bonbrubon
Опишите пожалуйста, справились ли вы и как же все таки удобнее ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB