Contents

監控電腦活著發送 DISCORD 通知

最近 Raspberry Pi 三號機網路常常掛點
雖然之前有找到讓它重新開機的方法
Linux在Wifi使用pppoe連線後,重開機不能連線上網 | 程式狂想筆記
但我沒採用這個方案
畢竟有時候需要確保有哪些程式正在執行
再重開機是比較好的

有問題電腦解決重新連線方法

最近看到Headless raspberryPi with eth0+USB issue Register 0x00000114 - Raspberry Pi Forums
這邊會 ping 自己的路由
失敗會重啟 Interface

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh

# cron script for checking wlan connectivity
IP_FOR_TEST="192.168.1.1"
PING_COUNT=1

PING="/bin/ping"
IFUP="/sbin/ifup"
IFDOWN="/sbin/ifdown --force"
INTERFACE="eth0"

FFLAG="/opt/check_lan/stuck.fflg"

# ping test
$PING -c $PING_COUNT $IP_FOR_TEST > /dev/null 2> /dev/null
if [ $? -ge 1 ]
then
    logger "$INTERFACE seems to be down, trying to bring it up..."
        if [ -e $FFLAG ]
        then
                logger "$INTERFACE is still down, REBOOT to recover ..."
                rm -f $FFLAG 2>/dev/null
                sudo reboot
        else
                touch $FFLAG
                logger $(sudo $IFDOWN $INTERFACE)
                sleep 10
                logger $(sudo $IFUP $INTERFACE)
        fi
else
#    logger "$INTERFACE is up"
    rm -f $FFLAG 2>/dev/null
fi

但我不想重開機
之後找時間改寫

改成監控紀錄 log

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/sh

# cron script for checking wlan connectivity
IP_FOR_TEST="192.168.1.1"
PING_COUNT=1

PING="/bin/ping"
INTERFACE="eth0"

# ping test
$PING -c $PING_COUNT $IP_FOR_TEST > /dev/null 2> /dev/null
if [ $? -ge 1 ]
then
    logger -it check_interface "============================="
    logger -it check_interface "$INTERFACE seems to be down, trying to bring it up..."
    logger -it check_interface "carrier:"
    cat /sys/class/net/eth0/carrier | logger -it check_interface
    logger -it check_interface "operstate:"
    cat /sys/class/net/eth0/operstate | logger -it check_interface
    logger -it check_interface "route -n"
    route -n 2>&1 | logger -it check_interface
    logger -it check_interface "ifconfig:"
    ifconfig 2>&1 | logger -it check_interface
    logger -it check_interface "ping:"
    ping -c4 192.168.1.1 | logger -it check_interface
    ping -c4 8.8.8.8 | logger -it check_interface
    logger -it check_interface "============================="
fi

紀錄 log
linux日志logger命令详解_飘过的春风-CSDN博客_linux logger
Linux 如何將資料寫到 Syslog | Tsung’s Blog
shell - Linux : how to redirect stdout & stderr to logger? - Unix & Linux Stack Exchange

相關 interface 資訊
如何在 Linux Kernel 下偵測網路的連線狀態?
wifi连接中operstate和carrier分别是什么作用?-CSDN论坛
在Linux上,如何檢測物理電纜是否已連接到網卡插槽 - Ubuntu問答
树莓派折腾日记 二:网络相关配置 | 冰棒实验室

監控電腦活著發送 DISCORD 通知

其他機都非常穩定
別台監控狀態

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
PING="/bin/ping"
PING_COUNT=1

IP=(
192.168.1.1
192.168.1.2
192.168.1.3
)
DSCORD_WEBHOOK="https://discordapp.com/api/webhooks/*"

function sendDiscordNotice(){
        local MSG=$2
        # echo $MSG
        local URL=$1
        curl -H "Content-Type: application/json" \
        -X POST \
        -d "{\"username\": \"system\", \"content\": \"${MSG}\"}" $URL
}

#sendDiscordNotice $DSCORD_WEBHOOK "test"
for i in "${IP[@]}"
do
    #echo $i
    MSG="${i} 沒法 PING 到主機,請管理員查詢狀況"
    #echo $MSG
    $PING -c $PING_COUNT $i > /dev/null 2> /dev/null
    if [ $? -ge 1 ]; then
        sendDiscordNotice "${DSCORD_WEBHOOK}" "${MSG}"
    fi
done 

這邊學到shell function 參數是用 $1 $2
參數最後外面加個"預防參考帶進去有問題

Bash 程式設計教學與範例:function 自訂函數 - Office 指南

對 variable 使用 foeach

Loop through an array of strings in Bash? - Stack Overflow

番外

開機做發信動作

ubuntu server 開機自動發信通知(使用gmail) | pupuliao的部落格

決得這邊沒有考慮到網路的問題
但這個方法也滿有用的
先記錄

看到另類 ping 大法

剛好爬到不錯文章,想到之前有類似做這個,可以留著以後參考

为 ping 添加时间戳后台运行实时输出保存日志 | HelloDog 備份圖
为ping添加时间戳后台运行实时输出保存日志 - 知乎備份圖