Зависает wb-rules, помогает перезапуск

Все привет. Вопрос все еще остается открытым(( Увеличение длинны очереди помогает на какое-то время.

root@wirenboard-AEUQHNW4:~# systemctl status  wb-rules
● wb-rules.service - LSB: MQTT Rule Engine for Wiren Board
   Loaded: loaded (/etc/init.d/wb-rules; generated; vendor preset: enabled)
   Active: active (running) since Tue 2023-06-20 19:36:30 MSK; 1 weeks 3 days ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/wb-rules.service
           └─1425 /usr/bin/wb-rules -syslog -queue-len 4096 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/

июн 30 17:45:12 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4086/4096
июн 30 17:46:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4087/4096
июн 30 17:46:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4088/4096
июн 30 17:46:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4089/4096
июн 30 17:46:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4090/4096
июн 30 17:46:11 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4091/4096
июн 30 17:46:12 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4092/4096
июн 30 17:47:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4093/4096
июн 30 17:47:10 wirenboard-AEUQHNW4 wb-rules[1425]: ERROR: queue Tokens is almost filled! 4094/4096
июл 01 10:39:12 wirenboard-AEUQHNW4 wb-rules[1425]: WARNING: queue Events is half-filled: 2049/4096

Пока для себя добавил правило отправки в телегу сообщения каждый день. Если сообщение не пришло - значит есть проблема. Хочу автоматизировать перезапуск движка.
Подскажите можно как-то автоматически понять что служба не работает? Первое что приходит на ум это конечно парсить вывод статус. Может быть есть способы элегантнее?

P.S батарейку меняю переодически.

У меня правило по таймеру раз в минуту пишет в mqtt таймстемп.

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

Костыль, но работает уже несколько лет безотказно.

1 Like

Приветствую! А не могли бы вы поделиться данным скриптом? Был бы вам очень благодарен!

Конечно

правило

defineRule("_keep_alive", {
    when: cron("1 * * * *"),
    then: function () {
        var d = new Date();
        dev.util['Alive'] = Math.floor(d.getTime() / 1000).toString();
    }
});

скрипт, запускаемый по крону

#!/bin/bash

CURRENT=$(date +%s)
WB=$(mosquitto_sub -C 1 -t /devices/util/controls/Alive)
DIFF=180

if [ $(($CURRENT-$WB)) -gt $DIFF ]; then
    echo "`date`: wb-rules hung up, restarting..."
    systemctl restart wb-rules
fi
2 Likes

Большое спасибо! А подскажите, как можно проверить. что скрипт работает? запускал его, но в консоль ничего не вывелось.

Добавьте этот скрипт в системный крон, примерно в таком вот виде:

* * * * *   root    /path/to/wbrules_checker.sh >> /var/log/wbrules_checker.log

И тогда если правила зависнут, в логе появится запись об этом

в crontab добавил так:

  • /1 * * * root /mnt/data/scripts/restart_wb-rules.sh >> /var/log/restart_wb-rules.log
    остановил сервис
    service wb-rules stop
    лог не появился. При попытке запустить скрипт:
    /mnt/data/scripts/restart_wb-rules.sh
    wb-rules не запустился.
    Может я что-то делаю не так?

попробуйте chmod 755 /mnt/data/scripts/restart_wb-rules.sh

Это я сделал в самом начале. Я так понимаю если скрипт отработал, то в консоль должно выводиться сообщение? может есть ещё какой лог, где посмотреть работу скрипта? а то вот опять буквально вчера wb-rules завис по не понятной причине. Причём хоть все правила удалить - это не поможет.

В консоль выведется сообщение, только если wb-rules завис и был перезапущен. Можно и на каждый вызов выводить, но зачем? У вас будет 1440 сообщений в логе в сутки, что скрипт запустился.

А перезапустит ли скрипт wb-rules, если его остановить в ручную? И если можно, то как сделать постоянный вывод сообщения в консоль об успешном запуске? Хочу понять отрабатывает ли у меня скрипт совместно с правилом? Спасибо!

Да, перезапустит. Попробуйте так

#!/bin/bash

CURRENT=$(date +%s)
WB=$(mosquitto_sub -C 1 -t /devices/util/controls/Alive)
DIFF=180

if [ $(($CURRENT-$WB)) -gt $DIFF ]; then
    echo "`date`: wb-rules hung up, restarting..."
    systemctl restart wb-rules
else
    echo "`date`: all good..."
fi

К сожалению, в консоль вообще ничего не выводится! При запуске скрипта
/mnt/data/scripts/restart_wb-rules.sh
в консоли никаких сообщений, но при этом скрипт висит пустым окном и его можно закрыть нажав комбинацию ctrl +z

Топик, значит, не создался, либо у него другое имя. Проверьте - оно точно такое?
/devices/util/controls/Alive

Пересмотрел все топики в mqtt каналах, но ничего похожего там не обнаружилось.

Полностью скрипт для wb-rules должен выглядеть вот так:

defineVirtualDevice('util', {
    title: 'Util', //
    cells: {
        'Alive': {
            type: 'text',
            value: ''
        }
    }
});

defineRule("_keep_alive", {
    when: cron("1 * * * *"),
    then: function () {
        var d = new Date();
        dev.util['Alive'] = Math.floor(d.getTime() / 1000).toString();
    }
});

1 Like

Огромное спасибо! Всё заработало!

Не понимаю в чём проблема? Из консоли скрипт отрабатывает отлично! добавляю его в crontab. nano crontab -e, добавляю строку */1 * * * * /mnt/data/scripts/restart_wb-rules.sh, сохраняю ctrl +x. Но крон не выполняет задачу! В чём может быть проблема?

А почему вы думаете, что крон не запускает скрипт?

  1. Пробовал добавлять строку для вывода сообщения в лог >> /tmp/restart.log. log не появился. 2. пробовал остановить wb-rules командой service wb-rules stop.ждал несколько минут, но сервис не поднялся. вывод скрипт не запускается.