Зависает 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 лайк

Здравствуйте. Вынес относительно свежие сообщения в новую тему.

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

Можете дать больше информации? Например, версии пакетов, контроллера, релиза, диагностический архив в момент зависания (инструкция).

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

Верно и это очень плохо, пора что-то менять и вы можете в этом нам помочь. Например, мы недавно с помощью пользователей починили давнюю проблему в драйвере Smart Web.

Спасибо, буду признателен.

Здравствуйте — получилось ли выгрузить диагностический архив в момент зависания?

У меня было 2 зависания, только диагностический архив, похоже, с ошибкой выгрузился

Command 'lsusb -t' didn't finished in 5.0s
Command 'lsusb' didn't finished in 5.0s
Command 'emmcparm -V -I -t -B -S  -E -e /dev/mmcblk0' didn't finished in 5.0s

Но что-то все-равно выгрузилось

1 лайк

Спасибо! Кажется, в логах есть что-то интересное. Я посоветуюсь с программистами и вернусь. У вас какой релиз сейчас установлен? К сожалению, мы в архив информацию о релизе добавили недавно.

wb-2204 - это ж оно?

@bzzeke Здравствуйте, мне воспроизвести проблему не удалось, но в ваших архивах и логах есть достаточно информации для понимания корня проблемы — спасибо!

Оформил багрепорт, запланируем в разработку на ближайшие пару месяцев, отпишусь сюда, как займёмся.

Класс, спасибо! А можете сказать что в логах указывает на проблему?
“Для повышения образованности” (с)

1 лайк

Да, конечно. Там одно из правил с использованием cron падает:

июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: 2023/07/29 17:22:38 cron: panic running job: send on closed channel
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: goroutine 855570 [running]:
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.(*Cron).runWithRecovery.func1(0x13d0d20)
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:161 +0x74
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: panic(0x345b40, 0x3aff48)
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         runtime/panic.go:969 +0x158
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: github.com/wirenboard/wb-rules/wbrules.(*RuleEngine).CallSync(0x1168100, 0x135c2f0)
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         github.com/wirenboard/wb-rules/wbrules/engine.go:893 +0xf4
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: github.com/wirenboard/wb-rules/wbrules.cronProxy.AddFunc.func1()
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         github.com/wirenboard/wb-rules/wbrules/engine.go:495 +0x24
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.FuncJob.Run(0x1284ea0)
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:92 +0x1c
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.(*Cron).runWithRecovery(0x13d0d20, 0x3b45e0, 0x1284ea0)
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:165 +0x50
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]: created by gopkg.in/robfig/cron%2ev1.(*Cron).run
июл 29 17:22:38 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:199 +0x590
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: 2023/07/29 17:22:38 cron: panic running job: send on closed channel
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: goroutine 855571 [running]:
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.(*Cron).runWithRecovery.func1(0x13d0d20)
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:161 +0x74
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: panic(0x345b40, 0x3aff48)
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         runtime/panic.go:969 +0x158
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: github.com/wirenboard/wb-rules/wbrules.(*RuleEngine).CallSync(0x1168100, 0x135c300)
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         github.com/wirenboard/wb-rules/wbrules/engine.go:893 +0xf4
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: github.com/wirenboard/wb-rules/wbrules.cronProxy.AddFunc.func1()
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         github.com/wirenboard/wb-rules/wbrules/engine.go:495 +0x24
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.FuncJob.Run(0x1284ec0)
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:92 +0x1c
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: gopkg.in/robfig/cron%2ev1.(*Cron).runWithRecovery(0x13d0d20, 0x3b45e0, 0x1284ec0)
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:165 +0x50
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]: created by gopkg.in/robfig/cron%2ev1.(*Cron).run
июл 29 17:22:39 wirenboard-ANGSN6H4 wb-rules[7688]:         gopkg.in/robfig/cron.v1@v1.2.0/cron.go:199 +0x590

5 сообщений было перенесено в новую тему: Зависает правило на wb-rules

Есть какие-нибудь результаты по исправлению ошибки?

Если поможете найти путь к устойчивому воспроизведению такого состояния сервися - это сильно ускорит процесс.

3 сообщения были перенесены в новую тему: “Зависание” wb-rules

@bzzeke @panason

Здравствуйте, пришлите, пожалуйста, ваши правила.

Добрый день, Александр.

Вот все мои правила, где крон используется:

defineVirtualDevice('hardnode', {
    title: 'Hardnode',
    cells: {
        'CPU temperature' : {
            type : 'temperature',
          	value: ''
        },
        'Fan1 speed' : {
            type : 'text',
          	value: ''
        },
        'Fan2 speed' : {
            type : 'text',
          	value: ''
        }
    }
});

defineRule("hardnode.status", {
    when: cron("@every 10s"),
    then: function () {
        runShellCommand("/etc/wb-rules/services/dio sensors", {
            captureOutput: true,
            exitCallback: function (exitCode, capturedOutput) {
                var data = JSON.parse(capturedOutput);
                dev['hardnode']['CPU temperature'] = data['cpu_temp'];
                dev['hardnode']['Fan1 speed'] = data['fans'][0] || "0";
                dev['hardnode']['Fan2 speed'] = data['fans'][1] || "0";
            }
        });
    }
});


defineVirtualDevice('ups', {
    title: 'UPS',
    cells: {
        'Battery charge' : {
            type : 'text',
          	value: ''
        },
        'Input voltage' : {
            type : 'voltage',
          	value: ''
        },
        'Load' : {
            type : 'text',
          	value: ''
        },      
        'Status' : {
            type : 'text',
          	value: ''
        }
    }
});


defineRule("ups.status", {
    when: cron("@every 10s"),
    then: function () {
        runShellCommand("/etc/wb-rules/services/dio ups", {
            captureOutput: true,
            exitCallback: function (exitCode, capturedOutput) {
                var data = JSON.parse(capturedOutput);

                dev['ups']['Battery charge'] = data['battery.charge'].toString() || 0;
                dev['ups']['Input voltage'] = parseFloat(data['input.voltage']) || 0;
                dev['ups']['Load'] = data['ups.load'] ? data['ups.load'] + '%' : 0;

		if (data['ups.status']) {
                    if (data['ups.status'] == 'OL' || data['ups.status'] == 'OL CHRG' || data['ups.status'] == 'OL CHRG LB') {
                        dev['ups']['Status'] = 'Online';
                    } else if (data['ups.status'] == 'OB' || data['ups.status'] == 'OB DISCHRG') {
                        dev['ups']['Status'] = 'Battery';
                    } else {
                        dev['ups']['Status'] = 'Low battery';
                  }
                } else if (data['error']) {
                    dev['ups']['Status'] = data['error'];
                }
            }
        });
    }
});


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();
    }
});


defineVirtualDevice('weather', {
    title: 'Weather',
    cells: {
        'LIM AQ' : {
            type : 'text',
            value: ''
        },
        'ULN wind' : {
            type : 'text',
            value: ''
        },
        'ULN wind direction' : {
            type : 'text',
            value: ''
        },
        'ULN temperature' : {
            type : 'temperature',
            value: 0
        }
    }
});


defineRule("weather.status", {
    when: cron("@every 15m"),
    then: function () {
        runShellCommand("/etc/wb-rules/services/dio weather", {
            captureOutput: true,
            exitCallback: function (exitCode, capturedOutput) {

                var data = JSON.parse(capturedOutput);
                dev['weather']['LIM AQ'] = data['air_quality'].toString() || 0
                dev['weather']['ULN wind'] = data['wind'].toString() || 0;
                dev['weather']['ULN wind direction'] = data['wind_direction'].toString() || 0;
                dev['weather']['ULN temperature'] = data['temperature'] || 0;
            }
        });
    }
});