Linux高阶—shell脚本企业实战(八)

本文提供了五个Linux系统的管理案例,包括收集设备信息并写入数据库、实时监控操作系统运行状态、远程监控服务器CPU、DNS管理脚本以及处理时钟同步问题的脚本。这些脚本通过shell自动化实现,能有效提升服务器管理和维护效率。
摘要由CSDN通过智能技术生成

目录

案例一:采集设备基本信息并写入mysql数据库

案例二:监控操作系统运行情况

案例三:远程监控服务器CPU 运行情况

案例四:Bind DNS 管理脚本工具

案例五:时钟跳变同步处理,解决因时钟跳变导致服务运行异常问题。​​​​​​​


案例一:采集设备基本信息并写入mysql数据库

1、创建数据库表SQL语句代码如下:

CREATE TABLE 'serv_info' (
'id' int (11) NOT NULL AUTO_INCREMENT,
'host_info' varchar (50) NOT NULL,
'cpu_info' varchar (50) NOT NULL,
'disk_info' varchar (50) NOT NULL,
'mem_info' varchar (50) NOT NULL,
'ip_info' varchar (50) NOT NULL,
'mask_info' varchar (50) NOT NULL,
'gateway' varchar (50) NOT NULL,
'mark_info' varchar (50) NOT NULL,
PRIMARY KEY ('id'),
UNIQUE KEY 'ip_info' ('ip_info')
);

2、shell脚本实现服务器信息自动收集代码如下:

#!/bin/bash
echo -e "\033[34m\033[1m"
cat << EOF
++++++++Welcome to use system Collect+++++++++++++
EOF

host_info=`hostname |tail -1`
cpu_info1=`cat /proc/cpuinfo |grep "model name" |tail -l |awk -F: '{print $2}' |sed 's/^//g' |awk '{print $1, $3, $4, $6}'`
cpu_info2=`cat /proc/cpuinfo |grep "physical id" |sort |uniq -c| wc -l`
disk_info=`fdisk -l |grep "Disk /dev/sd" |grep -v "identifier" |awk '{print $2, $3, $4}'|sed 's/,//g'`
mem_info=`free -g |grep "Mem" |awk '{print $2"GB"}'`
ip_info=`ifconfig |grep "broadcast"|tail -1 |awk '{print $2}' |cut -d: -f2`
mask_info=`ifconfig |grep "broadcast"|tail -1 |awk '{print $4}'`
gateway=`ip route |grep default |awk '{print $3}'`
mark_info="IDC01"

echo -e "\033[32m -------------------------------------------------- \033[0m"
echo HOSTNAME: ${host_info}
echo CPU_INFO: ${cpu_info1} ${cpu_info2}c
echo DISK INFO: ${disk_info}
echo MEM INFO: ${mem_info}
echo IPADDR: ${ip_info}
echo MASK INFO: ${mask_info}
echo GATEWAY: ${gateway}
echo MARK INFO: ${mark_info}
echo -e "\033[32m --------------------------------------------------- \033[0m"

echo -e -n "\033[36mYou want to write the data to the databases? \033[1m"; read ensure
if [ "$ensure" == "yes" -o "$ensure" == "y" -o "$ensure" == "Y" ]; then
  echo -e "\033[31mmysql -u audit -p 123456 -D audit -e 'insert into serv_info values('', '${host_info}', '${cpu_info1} ${cpu_info2}c', '${disk_info}', '${mem_info}', '${ip_info}', '${mark_info}', '${gateway}', '${mark_info}')'\033[0m"
  mysql -u audit -p 123456 -D audit -e 'insert into serv_info values('', '${host_info}', '${cpu_info1} ${cpu_info2}c', '${disk_info}', '${mem_info}', '${ip_info}', '${mark_info}', '${gateway}', '${mark_info}')'
else
  echo "Please wait, exit......"
  exit
fi

案例二:监控操作系统运行情况

#/bin/bash
#########################准备初始化环境#########################
_work_dir=/root/tmp
#Build workdir directory
    if [ ! -d ${_work_dir} ]
    then
        mkdir ${_work_dir}
    fi
_log_dir=${_work_dir}/log
#Build log directory
    if [ ! -d ${_log_dir} ]
    then
        mkdir ${_log_dir}
    fi
	
touch ${_log_dir}/{check.log,warn_check.log}
_check_msg=${_log_dir}/check.log
_warn_mgs=${_log_dir}/warn_check.log
_param=(cpu_check memory_check disk_check network_check serv_kip)

function info() {
    echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
    echo -e "\033[31m [WARN] \033[0m$@"
}
#########################监控CPU使用情况#########################
function cpu_check
{
while true
  do
    only_cpu=`top -b -n1 |grep Cpu |awk -F ',' '{print $4}'|sed 's/%id//g' |sed 's/^//g' |cut -d. -f1 |sed 's/ //g'`
    use_cpu="$(echo "scale=0;100-${only_cpu}"|bc)"
    if [[ "$use_cpu" -gt "80" ]]; then
       warn "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$use_cpu"%!" >> "${_check_msg}"
    else
       info "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$use_cpu"%!" >> "${_check_msg}"
    fi
    sleep 10
  done
}
#########################监控内存使用情况#########################
function memory_check
{
while true
  do
    use_memory=`free -g |grep Mem  |awk '{print $3,$2,$3*100/$2}' |awk '{print $3}'|awk -F. '{print $1}'`       
    free_cache=`free -g |grep Mem |awk '{print $7}'`
    if [[ ${use_memory} -ge 95 ]] && [[ ${free_cache} -le 2 ]] ; then
       warn "`date +'[%Y-%m-%d %H:%M:%S]'`  memory use "$use_memory"%!" >> "${_check_msg}"
    else
       info "`date +'[%Y-%m-%d %H:%M:%S]'`  memory use "$use_memory"%!" >> "${_check_msg}"
    fi
    sleep 10
  done
}
#########################监控磁盘使用情况#########################
function disk_check
{
while true
  do
    USE_RATE_LIST=`df |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}'`
    for USE_RATE in $USE_RATE_LIST; 
    do
      PART_NAME=${USE_RATE%=*}
      USE_RATE=${USE_RATE#*=}
      if [[ $USE_RATE -ge 95 ]]; then
         warn "`date +'[%Y-%m-%d %H:%M:%S]'`  $PART_NAME  $USE_RATE%!" >> "${_check_msg}"
      else
         info "`date +'[%Y-%m-%d %H:%M:%S]'`  $PART_NAME  $USE_RATE%!" >> "${_check_msg}"
      fi
    done
   sleep 120	
  done
}
#########################监控网络通信情况#########################
function network_check 
{
while true
 do
  while read line
  do
    if ping -c 3 $line >/dev/null 2>&1 ; then
       info "`date +'[%Y-%m-%d %H:%M:%S]'` $line network is normal" >> "${_check_msg}"
    else
       warn "`date +'[%Y-%m-%d %H:%M:%S]'` $line network is unhealthy" >> "${_check_msg}"
    fi
  done < ip_list 
  sleep 300  
  done    
}
#####################监控操作系统运行KPI情况######################
function serv_kpi
{
while true
 do
   kpi_cnts=$(grep WARN ${_check_msg} |wc -l )
   if [[ $kpi_cnts -lt 5 ]];then
      echo > ${_warn_mgs}
   else
      grep WARN ${_check_msg} >>${_warn_mgs}
   exit -1
   fi  
   sleep 600 
 done
}
#########################脚本批量并行调用#########################
function func_reco
{
 for i in $@
   do
    $i &
   done
}
set -o errexit
func_reco ${_param[@]}

案例三:远程监控服务器CPU 运行情况

#Remote execution tool
vim cpu_check.sh 

#!/bin/bash
_work_dir=/root/tmp
#Build workdir directory
    if [ ! -d ${_work_dir} ]
    then
        mkdir ${_work_dir}
    fi
_log_dir=${_work_dir}/log
#Build log directory
    if [ ! -d ${_log_dir} ]
    then
        mkdir ${_log_dir}
    fi
	
touch ${_log_dir}/{check.log,command.log}
_check_msg=${_log_dir}/check.log
_command_msg=${_log_dir}/command.log
_tmp_check_msg=${_log_dir}/tmp_check.log

function info() {
    echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
    echo -e "\033[31m [WARN] \033[0m$@"
}

# LAN SERVERS
LANSERVER=(
192.168.31.214,test01
192.168.31.215,test02
) #填写IP与主机名
_REMOTE_UN="luojie" #填写登入用户名
_REMOTE_PW="123456" #填写登入密码
_ROOT_PW=""  #填写root密码
_CMD="top -b -n1 |grep Cpu" #填写需要执行的指令

# CHECK CPU
while true
 do
  for ((i=0; i< ${#LANSERVER[*]}; i++))
   do
   _REMOTE_IP=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $1}'`
   _REMOTE_NAME=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $2}'`
   
   if [ "$_ROOT_PW" = "" ]; then
      expect common_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_CMD}" > ${_tmp_check_msg}
   else
      expect root_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_ROOT_PW}" "${_CMD}" > ${_tmp_check_msg} 
   fi
   
   if [ $? -eq 0 ];then
      info "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  Command ************** [success]" |tee -a ${_command_msg}
   else
      warn "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  Command ************** [failure]" |tee -a ${_command_msg}
   fi
   
   _ONLY_CPU=`cat ${_tmp_check_msg} |grep Cpu |grep -v top |awk -F ',' '{print $4}'|sed 's/%id//g' |sed 's/^//g' |cut -d. -f1 |sed 's/ //g'`
   _USE_CPU="$(echo "scale=0;100-${_ONLY_CPU}"|bc)"
   
   if [[ "$_USE_CPU" -gt "80" ]]; then
      warn "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$_USE_CPU"%!" >> "${_check_msg}"
   else
      info "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$_USE_CPU"%!" >> "${_check_msg}"
   fi
  done
  sleep 10
 done

#remote common_user.exp
vim common_user.exp

#!/usr/bin/expect -f
set timeout 5

set host_name  [lindex $argv 0]
set host_ip    [lindex $argv 1]
set host_un    [lindex $argv 2]
set host_pw    [lindex $argv 3]
set CMD        [lindex $argv 4]

set login_flag 1

spawn ssh ${host_un}@${host_ip}

 expect {
   "yes/no" {send "yes\r"; exp_continue}
   "password:" {send "${host_pw}\r"}
   "Password:" {send "${host_pw}\r"}
 }
 expect {
   "${host_name}" {set login_flag 0 ;send "${CMD}\r"}
   expect eof
 }
send "exit\r"
expect eof
exit $login_flag

#remote root_user.exp
vim root_user.exp

#!/usr/bin/expect -f
set timeout 5

set host_name  [lindex $argv 0]
set host_ip    [lindex $argv 1]
set host_un    [lindex $argv 2]
set host_pw    [lindex $argv 3]
set root_pw    [lindex $argv 4]
set CMD        [lindex $argv 5]

set login_flag 1

spawn ssh ${host_un}@${host_ip}

 expect {
   "yes/no" {send "yes\r"; exp_continue}
   "password:" {send "${host_pw}\r"}
   "Password:" {send "${host_pw}\r"}
 }
 expect {
   "${host_name}" {set login_flag 0 ;send "su -\r"; exp_continue}
   "password:" {send "${root_pw}\r"}
   "Password:" {send "${root_pw}\r"}
 }
 expect {
   "*${host_name}*#" {set login_flag 0 ;send "${CMD}\r"}
   expect eof
 }
send "exit\r"
expect eof
exit $login_flag

案例四:Bind DNS 管理脚本工具

#-------------------------------------------------------#
#config _FILE bind server
#/etc/logrotate.d/named
#/etc/named.conf
#/etc/named.rfc1912.zones
#/etc/named.root.key
#/etc/rndc.key
#/etc/rwtab.d/named
#/etc/sysconfig/named
#/var/named/named.ca
#/var/named/named.empty
#/var/named/named.localhost
#/var/named/named.loopback
#-------------------------------------------------------#

#!/bin/bash
#Auto install config bind server
#By author jfedu.net 2017
Define Path variables
BND_ETC=/etc
BND_VAR=/var/named
BAK_DIR =/data/backup/dns 'date +%Y%m%d-M'
#Backup named server
if [!-d $BAK_DIR]; then
   echo "Please waiting Backup Named Config............"
   mkdir -p $BAK_DIR
   cp -a /var/named/.* $BAK_DIR
   cp -a /etc/named.* $BAK_DIR
fi
Define Shell Install Function
Install ()
{
if [ ! -e /usr/sbin/named ]; then
   yum -y install bind* 
else
   echo -----------------------------------------------------
   echo "The Named Server is exists,Please exit........."
  sleep 1
fi
}
##Define Shell Init Function
Init_Config ()
{
   sed -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' /etc/named.conf
   echo -----------------------------------------------------
   sleep 1
   echo "The named.conf config Init success !"
}

#Define Shell Add Name Function
Add_named ()
{
##DNS name
    read -p "Please Insert Into Your Add Name, Example 51cto.com : "_NAME
    echo $_NAME |grep -E "com|cn|net|org"
    while [ "$?" -ne 0 ]
    do
      read -p "Please reInsert Into Your Add Name, Example 51cto.com : "_NAME
      echo $_NAME |grep -E "com|cn|net|org"
    done
##IP address
    read -p "Please Insert Into Your Name Server IP address: "_IP
    echo $_IP egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
    while [ "$?" -ne "0" ]
    do
      read -p "Please Insert Into Your Name Server IP address: "_IP
      echo $_IP egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
    done
    _ARPA_IP = 'echo $_IP |awk -F. '(print $3"."$2"."$1)''
    _ARPA_IP1 = 'echo $_IP |awk -F. '(print $4)''
    cd $BND_ETC
    grep "$_NAME" named.rfc1912.zones
if [ $?-eq 0 ]; then
       echo "The $_NAME IS exist named.rfc1912.zones conf,please exit..."
       exit
    else
       read -p "Please Insert Into _SLAVE Name Server IP address: "_SLAVE
       echo $_SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
    while [ "$?" -ne "0" ]
    do
       read -p "Please Insert Into _SLAVE Name Server IP address: "_SLAVE
       echo $_SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
    done
    grep "rev" named.rfc1912.zones
 if [ $?-ne 0 ];then
      cat >named.rfc1912.zones <EOF
#'date +%Y-%m-%d'Add $_NAME CONFIG
zone "$_NAME" IN {
     type master;
     _FILE "$_NAME.zone";
     allow - update { none; };
};
zone "$_ARPA_IP.in-addr.arpa" IN {
     type master;
     _FILE "$_ARPA_IP.rev";
     allow - update { none; };
};
EOF
 else
     cat >named.rfc1912.zones <EOF
#'date +%Y-%m-%d'Add $_NAME CONFIG
zone "$_NAME" IN {
     type master;
     _FILE "$_NAME.zone";
     allow - update { none; };
};
EOF
 fi
fi
    [ $? -eq 0 ] && echo "The $_NAME config name.rfc1912.zones success !"
    sleep 3 ;echo "please waiting config $_NAME zone _FILE............."
    cd $BND_VAR
    read -p "Please insert Name DNS A HOST EXample www or mail : "_HOST
    read -p "Please insert Name DNS A NS IP ADDR EXample 192.168.111.130 : "_IP_HOST
    echo $_IP_HOST |egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}"
    ARPA_IP2 'echo |$_IP_HOST |awk -F. '(print $3"."$2"."$1)''  
    ARPA_IP3 'echo |$_IP_HOST |awk -F. '(print $4)''
    while [ "$?" -ne "0" ]
    do
      read -p "Please insert Name DNS A NS IP ADDR EXample 192.168.111.130 : "_IP_HOST
      echo $_IP_HOST |egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}"
    done
    cat $_NAME.zone <EOF
\$TTL 1D
@       IN SOA  qitu.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@   IN  NS      dns.qitu.com //DNS服务器地址
@   IN  A       127.0.0.1
@   IN  AAAA    : : 1
www IN  A       192.168.31.103 //www的域名正向解析的地址
EOF
   REV='ls *.rev'
   ls *.rev >>/dev/null
if [ $? -ne 0 ];then
   cat >$_ARPA_IP.rev <EOF
\$TTL 1D
@       IN SOA  qitu.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@   IN    NS      dns.qitu.com //DNS服务器地址
192.168.31.103 IN PTR www //www的域名反向解析的地址
EOF
    echo "$_HOST IN A $_IP_HOST">>$_NAME.zone
    echo "$ARPA_IP3 IN PTR $_HOST.$_NAME.">>$_ARPA_IP.rev
    [ $? -eq 0 ] && echo -e "The $_NAME config success: \n$_HOST IN A $_IP_HOST\n $_ARPA_IP3 IN PTR $_HOST.$_NAME."
else
     sed -i "9a IN NS $_NAME." $REV
     echo "$_HOST IN A $_IP_HOST" >>$_NAME.zone
     echo "$_ARPA_IP3 IN PTR $_HOST.$_NAME.">$REV
     [ $? -eq 0 ] && echo -e "The $_NAME config success!: \n $_HOST IN A $_IP_HOST\n $_ARPA_IP3 IN PTR $_HOST.$_NAME."
fi
}
#Define Shell List A Function
Add_A_List ()
{
if
   cd $BND_VAR
   REV='ls *.rev'
   read -p "Please Insert Into Your Add Name,Example 51cto.com: "_NAME
   [ ! -e "$_NAME.zone" ]; then
   echo "The $_NAME.zone _FILE is not exist,Please ADD $_NAME.zone FILE: "
   Add_named ;
else
   read -p "Please Enter List Name A NS _FILE Example /tmp/name_list.txt: "_FILE
 if [ -e $_FILE ]; then
   for i in 'cat $_FILE |awk '(print $2)' |sed "s/$_NAME//g" |sed 's/.$//g''
do
    j='awk -v I="$i.$_NAME"'(if(I==$2)print $1)' $_FILE'
   echo -----------------------------------------------------
   echo "The $_NAME.zone _FILE is exist Please Enter insert NAME HOST ...."
   sleep 1
   _ARPA_IP = 'echo $j |awk -F. '(print $3"."$2"."$1)''
   _ARPA_IP2 = 'echo $j |awk -F. '(print $4)''    
   echo "$i IN A $j" >>$_NAME.zone
   echo "$_ARPA_IP2 IN PTR $i.$_NAME." >$REV
   [ $? -eq 0 ] && echo -e "The $_NAME config success: \n $i IN A $j\n $_ARPA_IP2 IN PTR $i.$_NAME."
done
 else
   echo "The $_FILE List _FILE IS Not Exist .......Please exit..."
 fi
fi
#Define Shell Select Menu
PS3 "Please select Menu Name Config: "
select i in "自动安装Bind服务""自动初始化Bind配置""添加解析域名""批量添加A记录"
do
   case $i in
        "自动安装Bind服务")
        Install
        ;;
        "自动初始化Bind配置")
        Init_Config
        ;;
        "添加解析域名")
        Add_named
        ;;
        "批量添加A记录")
        Add_A_List
        ;;
    * )
    echo -----------------------------------------------------
    sleep 1
    echo "Please exec: sh $0 {Install(1) or Init Config(2) or Add named(3) or Add config A(4)}"
    ;;
   esac
done

案例五:时钟跳变同步处理,解决因时钟跳变导致服务运行异常问题。

#!/bin/bash
#每5分钟做一下时间的变更,时钟合计快320秒,脚本每次执行缩小10秒,直至同步完成。


while true
do
 aaa=`ntpq -p |grep -v off |awk '{print $9}' |sed '/^$/d' |cut -d. -f 1`
 if [ $aaa  -lt -1000 ] ;then
 echo `date +"%T" --date='-10 second'`|xargs date -s
 elif [ $aaa  -gt 1000 ] ;then
 echo `date +"%T" --date='+10 second'`|xargs date -s
 else
 exit 1
 fi
sleep 300
done

上一篇:Linux高阶—shell远程批处理脚本(七)

下一篇:Linux高阶—安全认证模块PAM(九)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值