使用 watch 執行 shell 腳本 - 但該腳本失效了

使用 watch 執行 shell 腳本 - 但該腳本失效了

因此,我想密切關注我的網路連接,以便我可以向我的 ISP 提交報告。 (數據機似乎每天都會斷電一次,持續約 30-60 秒)

所以我複製了這個方便的小腳本

http://www.cyberciti.biz/tips/simple-linux-and-unix-system-monitoring-with-ping-command-and-scripts.html

並運行它

watch -n 15 ./ping-test.sh

我一直在拔掉調變解調器的插頭來測試它。

網路中斷後,手錶第一次運行腳本,它運作良好(發送一些電子郵件),然後就失效了。一旦網路恢復,腳本“完成”,然後 watch 再次運行它。

因此,我會在網路故障時收到郵件,但不會收到網路故障持續時間的郵件。

如果我直接從命令列運行腳本,它將運行(電子郵件)然後退出。

有什麼想法嗎?如何讓腳本在網路中斷後繼續運作?

答案1

如果無法達到目標就會掛起,這也許是腳本失效的原因,因為仍在等待回覆。嘗試新增-w 最後期限或者-W 暫停的選項

答案2

您可以使用“ip Monitor”即時執行此操作。這將輸出任何事件,例如 IP 位址被刪除或新增、連結狀態從可操作變更為斷開連接,或路由以某種方式變更。

ip monitor all >> /some/log.log &

您必須以附加模式開啟。如果您想讓它在終端機之外運行,您可以使用「disown %1」來取消該作業

如果您也需要時間戳,有幾種方法。一個簡單的方法是使用 inotifywait 檢查檔案是否有更新,然後將日期附加到其中。將上述內容和此內容放入 shell 腳本中很容易,並且可能會否認這一點,因此您將獲得

ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do 
  sleep 0.2;
  date >>/root/mon.log; 
done

享受

答案3

您使用“watch”命令的解決方案不好。我會嘗試用這樣的方法來解決這個問題:

#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
    for myHost in $HOSTS
    do
      count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
      if [ $count -eq 0 ]; then
        # 100% failed 
        echo "Host : $myHost is down (ping failed) at $(date)"
      fi
      done
sleep 15 # here is your refresh rate
done

然後像普通腳本一樣運行它:./script_name.sh

使用 CTRL+C 終止。

答案4

它會失效,因為它已經完成但依賴watch仍然存在的父進程 - 命令。

因此,我會在網路故障時收到郵件,但不會收到網路故障持續時間的郵件。

該腳本已經列印遠端系統關閉時的日期:

echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID

如何讓腳本在網路中斷後繼續運作?

它正在ping使用,-c 1因此在發送 1 個 ECHO_REQUEST 封包後將停止。

將其放入 cron 中每分鐘運行一次:

*/1 * * * * /path/to/your/script

相關內容