mosquitto_pub returns 4 一段时间后

mosquitto_pub returns 4 after some time

我有一个具有专有协议的 UPS,所以我唯一的选择是采用他们 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 字符串(命名为)并执行

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

这工作了一天左右,然后 mosquitto_pub 切换到返回 4,无效的用户或密码。

如果我重新启动命令,它会正常运行。

可能发生了什么?

我还可以从管道中捕获错误代码,退出 awk 并将该行放入 do while true 循环中吗?

Ed Morton 指出了正确的方向,将 mosquitto_pub 放入管道而不是 awk。

我试过了ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
这仅在 4096 个字符后向 mqtt 输出。

啊哈,正在缓冲。所以我在 awk

中的 printf 之后添加了 fflush("/dev/stdout");

这导致一次输出两行。原因:在 ups_status 和 awk.

之间缓冲

expect 包中的 unbuffer-命令解决了这个问题。

最终命令:
unbuffer ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l

这会每 3 秒提供一个不错的 mqtt 消息。