[英]Using Bash Script and mosquitto_sub what code would be used to execute a script based on MQTT message true or false?
[英]Script to check mosquitto is healthy
我正在嘗試為mosquitto創建一個運行狀況檢查腳本(由docker使用)。
if [ -z "$USERNAME" ]; then
mosquitto_sub -t '$SYS/#' -C 1 | grep -v Error || exit 1
else
mosquitto_sub -t '$SYS/#' -C 1 -u $USERNAME -P $PASSWRD | grep -v Error || exit 1
fi
我遇到的問題是,如果給了錯誤的密碼,mosquitto_sub只會繼續輸出Connection Refused: not authorised.
一遍又一遍,docker中的超時內容顯示為flakey,所以它永遠不會結束。
看起來mosquitto並沒有提供更好的失敗方法。 我認為我可能需要將其作為可以殺死的后台進程執行,但是我的bash並不是那么好,所以有人有更好的主意嗎?
[編輯-根據BMitch的建議進行了更新]
我已將腳本修改為如下所示:
#!/bin/sh
if [ -z "$USERNAME" ]; then
(sleep 10; kill $$) & exec mosquitto_sub -t '$SYS/#' -C 1 | grep -v Error || exit 1 "$@"
else
(sleep 10; kill $$) & exec mosquitto_sub -t '$SYS/#' -u $USERNAME -P $PASSWORD -C 1 | grep -v Error || exit 1 "$@"
fi
但是運行它只會得到以下輸出:
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Terminated
root@e30e9cadd8fc:/# Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
Connection Refused: not authorised.
關於如何超時運行腳本,有一個bash常見問題解答 。 嘗試將mosquitto_sub替換為包含以下內容的mosquitto_sub_timeout.sh:
#!/bin/bash
(sleep 10; kill $$) & exec mosquitto_sub "$@"
然后,您的運行狀況檢查腳本將如下所示:
if [ -z "$USERNAME" ]; then
mosquitto_sub_timeout.sh -t '$SYS/#' -C 1 | grep -v Error || exit 1
else
mosquitto_sub_timeout.sh -t '$SYS/#' -C 1 -u $USERNAME -P $PASSWRD | grep -v Error || exit 1
fi
正如bash FAQ中提到的那樣,最后一次更新,只要安裝在您的容器中,timeout命令可能是所有它們的最佳解決方案:
if [ -z "$USERNAME" ]; then
timeout --foreground 10 mosquitto_sub -t '$SYS/#' -C 1 | grep -v Error || exit 1
else
timeout --foreground 10 mosquitto_sub -t '$SYS/#' -C 1 -u $USERNAME -P $PASSWRD | grep -v Error || exit 1
fi
( BMitch的想法改變了)
我不得不超時參數從改變--foreground
到-t
和逃避$
通過將多了一個$
符號前。
在我的docker-compose中,查找下一個( 請記住,用戶名和密碼已刪除,您仍然可以添加它們-只需再次轉義$
符號 ): version: '3' services: mosquitto: image: 'eclipse-mosquitto:1.6.7' container_name: mosquitto hostname: mosquitto volumes: - ./mosquitto/data:/mosquitto/data - ./mosquitto/log:/mosquitto/log - ./mosquitto/config:/mosquitto/config networks: - cluster restart: on-failure healthcheck: test: ["CMD-SHELL", "timeout -t 5 mosquitto_sub -t '$$SYS/#' -C 1 | grep -v Error || exit 1"] interval: 10s timeout: 10s retries: 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.