mosquitto_pub возвращает 4 через некоторое время

#awk #mosquitto

Вопрос:

У меня есть ИБП с проприетарным протоколом, поэтому мой единственный вариант-взять их 8-летнюю 32-битную программу и передать ее через awk-скрипт. ups_status выдает такой экран каждые две секунды или около того.

       ----------===-----Welcome to ups_manager System!-----===-----
     Copyright(C) 2004 Richcomm Technologies, Inc.  May 16 2013 ver 1.1
 ----------------------------------------------------------------------------- 
| UPS Factory:                  UPS Model:             UPS Version:           |
|---------------------------------  ------------------------------------------|
| UPS Type           :   StandBY  || UPS Input Voltage: 227.00 Volt           |
| UPS Rating Voltage : 220.00 Volt||  |>>>>>>>>>>>>>>>>>>>>>>>-|----|----|----|
| UPS Rating Current :   3.00     || 180  190  200  210  220  230  240  250   |
| UPS Line Frequency :  50.00 Hz  ||                                          |
| Communication Port :      2     || UPS Output Voltage: 229.00    Volt       |
|                                 ||  |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
|     Input AC Power :  Normal    || 180  190  200  210  220  230   240  250  |
|     Battery Status :  Normal    ||                                          |
|     UPS Status     :  Normal    || UPS Power Loading:  18.00                |
|     Boost/Buck     :  Buck      ||  |>>>>|----|----|----|----|----|----|----|
|     UPS Temperature:   30.80    ||  0    20   40   60   80  100  120  140   |
|     UPS Self-Test  :  Normal    ||                                          |
|     Beeper Status  :  ON        ||  UPS Battery Level:  100.00              |
|                                 ||  |>>>>>>>>>>>>>>>>>>>>>>>>>----|----|----|
|                                 ||  0    20   40   60   80  100  120  140   |
|                                 ||                                          |
|                                 || UPS Input Frequency :  49.00 Hz          |
| ACfail Shutdown Delay : 3600 s  ||  |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
| UPS Turn Off Delay    :    2 min||  0    10   20   30   40   50   60   70   |
 ---------------------------------  ------------------------------------------ 
 

Я делаю ups_status | awk -f parseUPS.awk

parseUPS.awk проанализируйте значения и создайте json-строку (с именем out) и выполните

   /Turn Off/ {
     out=sprintf(....);
     print out | "mosquitto_pub -h mqtt.local.net -t ups -l" 
    }
 

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

Если я перезапущу команду, она будет работать правильно.

Что могло случиться?

Также могу ли я захватить код ошибки из канала, выйти из awk и поместить строку в цикл «делать, пока верно»?

Ответ №1:

Эд Мортон указал мне в правильном направлении, чтобы поместить mosquitto_pub в трубу, а не в awk.

Я пытался ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
Это дало вывод mqtt только после 4096 символов.

Ага, буферизация. Поэтому я добавил fflush("/dev/stdout"); после printf в awk

Это привело к тому, что на выходе появилось две строки одновременно. Причина: буферизация между ups_status и awk.

Команда unbuffer -из expect пакета решила эту проблему.

Последняя команда:
unbuffer ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l

Это дает хорошее mqtt-сообщение каждые 3 секунды.

Комментарии:

1. Боже, мы придирчивы…

2. Я думаю, что с первой строчки я отнесся к тебе нормально.

3. Вы сказали, что я «указал вам правильное направление», когда на самом деле я решил вашу проблему, а затем опубликовал ваш собственный ответ с незначительной, очевидной поправкой вместо того, чтобы принять мою, и когда я указал на это и обновил свой ответ, включив в него поправку, вы опубликовали язвительный, грубый комментарий «Боже, мы придирчивы…». Что угодно…