LINUX.ORG.RU

Архитектура скрипта мониторинга

 , , ,


0

2

Есть у меня самописная конфигурируемая панель на python’e, которая мне показывает разные данные. Каждый элемент описывается в конфигурации:

data = {
    "item0": {
        "status": True,
        "path": "./modules/connect_wireguard.sh",
        "result": " "
    },
    "item2": {
        "status": True,
        "path": "./modules/pomo.sh",
        "result": "OK:L "
    },
    "item3": {
        "status": True,
        "path": "./modules/io/cpu.sh",
        "result": "L "
    },
    "item4": {
        "status": True,
        "path": "./modules/io/ram.sh",
        "result": "L "
    },
    "item5": {
        "status": True,
        "path": "./modules/io/io.sh",
        "result": "L "
    },
    "item6": {
        "status": True,
        "path": "./modules/weather_wttr_in.py",
        "result": "W:L "
    },
    "item7": {
        "status": True,
        "path": "./modules/connect.sh",
        "result": "OK"
    },
    "item8": {
        "status": True,
        "path": "./modules/band2.py",
        # "result": "D:LOAD    U:LOAD "
        "result": ":L "
    },
    "item9": {
        "status": True,
        "path": "./modules/fs.sh",
        "result": "RHD:L,L,L "
    },
    "item91": {
        "status": True,
        "path": "./modules/date.sh",
        "result": "L. "
    },
    "item92": {
        "status": True,
        "path": "./modules/time.sh",
        "result": "L"
    }
}

Каждый скрипт генерирует данные, и скрипт это всё отдает dwm’у и панель обновляет данные. Каждый скрипт со своим таймаутом. Лет 15 это всё работает и всё хорошо, но появился один кейс и надо это всё как-то или переписать или расширить функционал. А кейс такой:

Скрипт ./modules/fs.sh обновляет данные каждые 300 секунд. Я когда-то поднимал тему, при df -h производится ли пересчет свободного места на диске(дергает ли постоянно df -h диск или нет)? Если да, то если поставить каждые 5 секунд, то имеем в час 720 или 17280 обращений к диску в сутки. Это не есть хорошо. Итак, скрипт ./modules/fs.sh нужен для того, чтобы мониторить свободное место на диске, чтобы можно было прогнозировать, сколько торрентов можно поставить на закачку. Попутно я удаляю просмотренные торренты и заметил, что я чаще смотрю не на панельку, а вручную запускаю df -h, т.к в панельке оно обновляется раз в пять минут. Поэтому нужно как-то делать, чтобы можно было обновлять или всю панельку или атомарно скрипты. На ум приходит два варианта:

  1. fifo на каждый скрипт, чтобы скрипты смотрели в фифо и если там появляется команда update, то обновляли по требованию
  2. более правильный. таймаут перенести из скриптов в python скрипт, чтобы скрипты не каждый сам в бесконечном цикле с таймаутом работал, а при обращении к нему отдавал данные и прекращал работу. Значит python скрипт должен создавать треды и каждые х секунд обращался к скриптам и чтобы можно было по ipc или по fifo отдавать команды на обновления каких-то item’ов

Или вообще как лучше организовать архитектуру этого хозяйства, чтобы этим всем барахлишком рулить?

★★★

Модуль «timer» дергает периодические модули. Модуль «fork», содает процесс и дергает опасные модули, которые могут упасть. Модуль «async», дергает модули которые любят зависать. Модуль «service», которые сами управляют своей жизнью. Модуль … В общем, надо придумать свой аналог systemd. И собирать каскад из модулей.

anonymous
()

Вместо теребонькания диска я бы пошёл смотреть на inotify, резон:

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

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

Bfgeshka ★★★★★
()

Как-то поздно ты задумался о лишних обращениях к диску. Надо было подумать лет 15 назад когда придумывал архитектуру, в которой каждый датчик лежит в отдельном файле

cobold ★★★★★
()

Итак, скрипт ./modules/fs.sh нужен для того, чтобы мониторить свободное место на диске, чтобы можно было прогнозировать, сколько торрентов можно поставить на закачку

Торрент клиент сам прекрасно умеет смотреть свободное место. Если задача скрипта только в этом можешь его выкинуть. Ну или ничего не трогать и пусть болтается.

ya-betmen ★★★★★
()

Хорошо, какие есть элегантные методы дать скрипту задание на актуализацию данных при запущенном цикле? Может быть проще имплементировать этот функционал непосредственно в скрипты, а не в скрипт мониторинга

#!/usr/bin/env bash
# set -x


SLEEP=300
ROOT="/"
H="/home"
D="/mnt/d"

fs () {
    if [[ $(findmnt -M "${1}") ]]; then
        echo -n $(( $(stat -f -c '%a * %S / 1024 / 1024 / 1024' ${1} ) ))
    else
        echo -n "n/a"
    fi
}

while :
do
    printf "|HD:%s,%s| \n" "$(fs ${H})" "$(fs ${D})"
    sleep ${SLEEP}
done
serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Хорошо, какие есть элегантные методы дать скрипту задание на актуализацию данных при запущенном цикле?

Стандартный метод - посылка сигнала фоновому скрипту и обработка этого сигнала командой trap в скрипте на bash.

sigurd ★★★★★
()