#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. Вы сказали, что я «указал вам правильное направление», когда на самом деле я решил вашу проблему, а затем опубликовал ваш собственный ответ с незначительной, очевидной поправкой вместо того, чтобы принять мою, и когда я указал на это и обновил свой ответ, включив в него поправку, вы опубликовали язвительный, грубый комментарий «Боже, мы придирчивы…». Что угодно…