注意点:
1.lost_rate变量赋值的时候,等号附近好像不能有空格。
2.还有if判断的时候,好像里面也是要标准格式,都是一个空格。
3.ping的这个ip应该是内网里其他ip,因为网卡故障的时候也可以ping通本地ip。
#!/bin/bash
date="`date '+%Y-%m-%d %H:%M:%S'`"
lost_rate=`ping -c 8 -w 8 192.168.0.xx | grep 'packet loss' | awk -F'packet loss' '{ print $1 }'| awk '{ print $NF }' | sed 's/%//g'`
if [ $lost_rate -eq 0 ];then
echo "network_ok $date">>/home/network_ok.log
elif [ $lost_rate -le 100 ];then
echo "network_error restart $date">>/home/network_error.log
ifdown em7
ifup em7
fi
改进版:(考虑到打印:未知的名称或服务)
#!/bin/bash
date="`date '+%Y-%m-%d %H:%M:%S'`"
lost_rate=`ping -c 8 -w 8 192.168.0.xx | grep 'packet loss' | awk -F'packet loss' '{ print $1 }'| awk '{ print $NF }' | sed 's/%//g'`
if [ $lost_rate -eq 0 ];then
echo "network_ok $date">>/home/network_ok.log
else
echo "network_error restart $date">>/home/network_error.log
ifdown em7
ifup em7
fi
第三版(最终版):
vim /var/mail/root 看当前用户的crontab输出日志,发现报错,原来是crontab运行的任务的环境变量是PATH=/usr/bin:/bin。
发现运行的命令,不在cron的环境变量,所以shell脚本里用绝对路径就可以了。(又踩坑了qq)
[root@master data]# which ifup
/usr/sbin/ifup
[root@master data]# which ifdown
/usr/sbin/ifdown
From root@master.localdomain Sun Sep 17 01:00:02 2023
Return-Path: root@master.localdomain
X-Original-To: root
Delivered-To: root@master.localdomain
Received: by master.localdomain (Postfix, from userid 0)
id 861DD6C2865; Sun, 17 Sep 2023 01:00:02 +0800 (CST)
From: “(Cron Daemon)” root@master.localdomain
To: root@master.localdomain
Subject: Cron root@master /xxx/restart_network_if_loss.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=536813>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=zh_CN.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: 20230916170002.861DD6C2865@master.localdomain
Date: Sun, 17 Sep 2023 01:00:02 +0800 (CST)
/data/restart_network_if_loss.sh:行10: ifdown: 未找到命令
/data/restart_network_if_loss.sh:行11: ifup: 未找到命令
#!/bin/bash
date="`date '+%Y-%m-%d %H:%M:%S'`"
lost_rate=`ping -c 8 -w 8 192.168.0.xx | grep 'packet loss' | awk -F'packet loss' '{ print $1 }'| awk '{ print $NF }' | sed 's/%//g'`
if [ $lost_rate -eq 0 ];then
echo "network_ok $date">>/home/network_ok.log
else
echo "network_error restart $date">>/home/network_error.log
/usr/sbin/ifdown em7
/usr/sbin/ifup em7
fi
一小时运行一次:
crontab -e
0 * * * * /data/restart_network_if_loss.sh
半小时运行一次:
crontab -e
0 ,30 * * * * /data/restart_network_if_loss.sh
如果需要cron运行任务的输出可以这样,把交互式的输出写入文件里:
0,30 * * * * /data/restart_network_if_loss.sh >> /data/network_output.log
参考文章:
https://www.cnblogs.com/luckyall/p/8094366.html