Shell script notes-2

Script to monitor disk utilization of 100 servers

#!/bin/bash
HOST_INFO=host.info
# 只要非#号开头的IP 。 这里的 /^[^#]/ ,^[^#]第一个^是锚点(断言) 
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    #获取用户名 设置变量ip,将$IP赋值给ip , 如果ip等于 $1,则输出 $2
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
    #获取端口
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
    TMP_FILE=/tmp/disk.tmp
    #ssh -p 22 root @192.168.1.99 'df -h'
    ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE
    #匹配以/dev/开头的行,将原先的空格,换成=号,更换OFS
    USE_RATE_LIST=$(awk 'BEGIN{
     
     OFS="="}/^\/dev/{
     
     print $NF,int($5)}' $TMP_FILE)
    for USE_RATE in $USE_RATE_LIST; do
       #Shell Parameter Expansion 参数展开 
       #最小限度从后面截取到=号 , 
       #  test="/boot=74"   
       # echo ${test%=*}  /boot
       #echo ${test#*=}    74
        PART_NAME=${USE_RATE%=*}
       #最小限度从前面截取到=号,    记法:可从键盘的数字键 #3(前)  %5(后)
        USE_RATE=${USE_RATE#*=}
        if [ $USE_RATE -ge 80 ]; then
            echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
        fi
    done
done

#host.info内容如下
#192.168.1.99 root 22
#192.168.1.100 root 22
#
#df -h 示例
#Filesystem               Size  Used Avail Use% Mounted on
#/dev/mapper/centos-root   19G   11G  8.4G  56% /
#devtmpfs                 974M     0  974M   0% /dev
#tmpfs                    991M     0  991M   0% /dev/shm
#tmpfs                    991M   31M  961M   4% /run
#tmpfs                    991M     0  991M   0% /sys/fs/cgroup
#/dev/sda1                197M  144M   54M  74% /boot
#tmpfs                    991M     0  991M   0% /tmp
#tmpfs                    199M     0  199M   0% /run/user/0
#
#[root@web01 awkTest]# df -h | awk 'BEGIN{
    
    OFS="="}/^\/dev/{
    
    print $NF,int($5)}'  的结果
#  /=56
#  /boot=74


Script to monitor whether the MySQL master-slave synchronization status is abnormal

#!/bin/bash  
HOST=localhost
USER=root
PASSWD=123.com
IO_SQL_STATUS=$(mysql -h$HOST -u$USER -p$PASSWD -e 'show slave status\G' 2>/dev/null |awk '/Slave_.*_Running:/{print $1$2}')
for i in $IO_SQL_STATUS; do
    #Slave_IO_Running:Yes --> ${i%:*}  -->  Slave_IO_Running   最小限度从后面截取到:号
    THREAD_STATUS_NAME=${i%:*}
    #Slave_IO_Running:Yes -->  ${i#*:}  --> Yes   最小限度从前面截取到:号
    THREAD_STATUS=${
    
    i#*:}
    if [ "$THREAD_STATUS" != "Yes" ]; then
        echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!" |mail -s "Master-Slave Staus" [email protected]
    fi
done



#[root@mysql02 ~]# mysql -uroot -uroot -pa123456 -e 'show slave status\G' 2>/dev/null | awk '/Slave_.*_Running:/{print $1$2}'
#Slave_IO_Running:Yes
# Slave_SQL_Running:Yes

Directory file change monitoring and real-time file synchronization

#!/bin/bash

MON_DIR=/opt
inotifywait -mqr --format %f -e create $MON_DIR |\
while read files; do
   rsync -avz /opt /tmp/opt
   #echo "$(date +'%F %T') create $files" | mail -s "dir monitor" [email protected]
done


#这里的写法太简单了。就只监控了 create 

Create 100 users in batches and set password scripts

#!/bin/bash
# $@ 传递给脚本或函数的所有参数。
USER_LIST=$@
USER_FILE=user.txt
for USER in $USER_LIST; do
    if ! id $USER &>/dev/null; then
        # 1a10c479
        PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
        useradd $USER
        echo $PASS |passwd --stdin $USER &>/dev/null
        echo "$USER   $PASS" >> $USER_FILE
        echo "$USER User create successful."
    else
        echo "$USER User already exists!"
    fi
done


#用法 user.sh li zhang wei wu yi

Batch check whether the website is abnormal script

#!/bin/bash  
URL_LIST="www.baidu.com www.ctnrs.com"
for URL in $URL_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -eq 200 ]; then
            echo "$URL OK"
            break
        else
            echo "$URL retry $FAIL_COUNT"
            let FAIL_COUNT++
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "Warning: $URL Access failure!"
    fi
done


#-o  /dev/null
#-o, --output FILE   Write output to <file> instead of stdout
#
#-s, --silent        Silent mode. Don't output anything
#-w, --write-out FORMAT  What to output after completion
#curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_nslookup:%{time_namelookup}\ntime_total: %{time_total}\n" "https://api.weixin.qq.com"
#https://blog.csdn.net/weifangan/article/details/80741981

Batch host remote execution of command scripts

#!/bin/bash
COMMAND=$*
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
    PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)
    # -c:执行脚本前先执行的命令,可多次使用。
    expect -c "
        #使用spawn进行 连接操作
       spawn ssh -p $PORT $USER@$IP
       expect {
          #当碰到 yes/no的时候send发送 yes , \r表示回车键, 否则 exp_continue表继续执行
          \"(yes/no)\" {send \"yes\r\"; exp_continue}
          \"password:\" {send \"$PASS\r\"; exp_continue}
           # 碰到 $USER@*时,这里的*是通配符。  
          \"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}
       }
    "
    echo "-------------------"
done


#cat host.info
#192.168.116.130 root 22 root
#192.168.116.131 root 22 root

#用法 bash 8.sh df -h 


One-click deployment of LNMP website platform scripts

#!/bin/bash
NGINX_V=1.15.6
PHP_V=5.6.36
TMP_DIR=/tmp

INSTALL_DIR=/usr/local

PWD_C=$PWD

echo
#echo要支持同C语言一样的\转义功能,只需要加上参数-e, -e  enable interpretation of backslash escapes
echo -e "\tMenu\n"
echo -e "1. Install Nginx"
echo -e "2. Install PHP"
echo -e "3. Install MySQL"
echo -e "4. Deploy LNMP"
echo -e "9. Quit"

function command_status_check() {
    
    
	if [ $? -ne 0 ]; then
		echo $1
		exit
	fi 
}

function install_nginx() {
    
    
    #TMP_DIR=/tmp
    cd $TMP_DIR
    yum install -y gcc gcc-c++ make openssl-devel pcre-devel wget
    wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz
    tar zxf nginx-${NGINX_V}.tar.gz
    cd nginx-${NGINX_V}
    #INSTALL_DIR=/usr/local
    
    ./configure --prefix=$INSTALL_DIR/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-stream
    command_status_check "Nginx - 平台环境检查失败!"
    make -j 4 
    command_status_check "Nginx - 编译失败!"
    make install
    command_status_check "Nginx - 安装失败!"
    mkdir -p $INSTALL_DIR/nginx/conf/vhost
    alias cp=cp ; cp -rf $PWD_C/nginx.conf $INSTALL_DIR/nginx/conf
    rm -rf $INSTALL_DIR/nginx/html/*
    echo "ok" > $INSTALL_DIR/nginx/html/status.html
    echo '<?php echo "ok"?>' > $INSTALL_DIR/nginx/html/status.php
    $INSTALL_DIR/nginx/sbin/nginx
    command_status_check "Nginx - 启动失败!"
}

function install_php() {
    
    
	cd $TMP_DIR
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
        libcurl-devel libjpeg-devel libpng-devel openssl-devel \
        libmcrypt-devel libxslt-devel libtidy-devel
    wget http://docs.php.net/distributions/php-${PHP_V}.tar.gz
    tar zxf php-${PHP_V}.tar.gz
    cd php-${PHP_V}
    ./configure --prefix=$INSTALL_DIR/php \
    --with-config-file-path=$INSTALL_DIR/php/etc \
    --enable-fpm --enable-opcache \
    --with-mysql --with-mysqli --with-pdo-mysql \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-freetype-dir \
    --enable-mbstring --enable-hash
    command_status_check "PHP - 平台环境检查失败!"
    make -j 4 
    command_status_check "PHP - 编译失败!"
    make install
    command_status_check "PHP - 安装失败!"
    #php.ini-production(生产环境用)
    cp php.ini-production $INSTALL_DIR/php/etc/php.ini
    cp sapi/fpm/php-fpm.conf $INSTALL_DIR/php/etc/php-fpm.conf
    cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    chmod +x /etc/init.d/php-fpm
    /etc/init.d/php-fpm start
    command_status_check "PHP - 启动失败!"
}

read -p "请输入编号:" number
case $number in
    1)
        install_nginx;;
    2)
        install_php;;
    3)
        install_mysql;;
    4)
        install_nginx
        install_php
        ;;
    9)
        exit;;
esac

#没有安装mysql的过程的?


One-click view of server resource utilization

    #!/bin/bash
    # vmstat :
    #procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    # r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    # 1  0      0 693452   2120 477944    0    0     0     1   12   36  0  1 99  0  0
    function cpu() {
    
    
        NUM=1
        while [ $NUM -le 3 ]; do
           #if(NR==3) 只打印第3行的数据 ,$15 第15列
            util=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
            user=`vmstat |awk '{if(NR==3)print $13"%"}'`
            sys=`vmstat |awk '{if(NR==3)print $14"%"}'`
            iowait=`vmstat |awk '{if(NR==3)print $16"%"}'`
            echo "CPU - 使用率: $util , 等待磁盘IO响应使用率: $iowait"
            let NUM++
            sleep 1
        done
    }

    #free -m
    #              total        used        free      shared  buff/cache   available
    #Mem:           1980         841         669          30         469         878
    #Swap:          2047           0        2047
    function memory() {
    
    
        total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
        # $NF 表示的最后一个Field(列),即输出最后一个字段的内容
        used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
        available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
        echo "内存 - 总大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
    }
    
    # df -h
    # Filesystem               Size  Used Avail Use% Mounted on
    # /dev/mapper/centos-root   19G   11G  8.4G  56% /
    # devtmpfs                 974M     0  974M   0% /dev
    # tmpfs                    991M     0  991M   0% /dev/shm
    # tmpfs                    991M   31M  960M   4% /run
    # tmpfs                    991M     0  991M   0% /sys/fs/cgroup
    # /dev/sda1                197M  144M   54M  74% /boot
    # tmpfs                    991M     0  991M   0% /tmp
    # tmpfs                    199M     0  199M   0% /run/user/0
    function disk() {
    
    
        fs=$(df -h |awk '/^\/dev/{print $1}')
        #/dev/mapper/centos-root
        #/dev/sda1
        for p in $fs; do
            mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
            size=$(df -h |awk '$1=="'$p'"{print $2}')
            used=$(df -h |awk '$1=="'$p'"{print $3}')
            used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
            echo "硬盘 - 挂载点: $mounted , 总大小: $size , 使用: $used , 使用率: $used_percent"
        done
    }

    # ss -antp
    # State       Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port
    # LISTEN      0      128                                  127.0.0.1:9000                                                     *:*                   users:(("php-fpm",pid=6635,fd=8),("php-fpm",pid=6634,fd=8),("php-fpm",pid=6580,fd=6))
    # LISTEN      0      64                                           *:38025                                                    *:*
    # LISTEN      0      128                                          *:111                                                      *:*                   users:(("rpcbind",pid=6210,fd=4),("systemd",pid=1,fd=49))
    # LISTEN      0      128                                          *:80                                                       *:*                   users:(("nginx",pid=6605,fd=6),("nginx",pid=6604,fd=6))
    # LISTEN      0      128                                          *:20048  
    
    function tcp_status() {
    
    
        #status[$1]++   第一列 $1 相同的自身累加
        summary=$(ss -antp |awk '{
     
     status[$1]++}END{
     
     for(i in status) printf i":"status[i]" "}')
        echo "TCP连接状态 - $summary"
    }

    cpu
    memory
    disk
    tcp_status
    
#bash machineResource.sh
#CPU - 使用率: 1% , 等待磁盘IO响应使用率: 0%
#CPU - 使用率: 1% , 等待磁盘IO响应使用率: 0%
#CPU - 使用率: 1% , 等待磁盘IO响应使用率: 0%
#内存 - 总大小: 1.9G , 使用: 1.1G , 剩余: 0.9G
#硬盘 - 挂载点: / , 总大小: 19G , 使用: 11G , 使用率: 56%
#硬盘 - 挂载点: /boot , 总大小: 197M , 使用: 144M , 使用率: 74%
#TCP连接状态 - LISTEN:27 ESTAB:4 State:1
#

Find out the process scripts that take up too much CPU memory

ps -eo user,pid,pcpu,pmem,args --sort=-pcpu  |head -n 10
#USER        PID %CPU %MEM COMMAND
#root     128135  0.6  0.3 sshd: root@pts/0
#root     128200  0.5  0.0 bash -c while [ -d /proc/$PPID ]; do sleep 1;head -v -n 8 /proc/meminfo; head -v -n 2 /proc/stat /proc/version /proc/uptime /proc/loadavg /proc/sys/fs/file-nr /proc/sys/kernel/hostname; tail -v -n 16 /proc/net/dev;echo '==> /proc/df <==';df;echo '==> /proc/who <==';who;echo '==> /proc/end <==';echo '##Moba##'; done
#root          9  0.4  0.0 [rcu_sched]
#mysql     12597  0.3 23.4 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf
#root       6204  0.2  0.3 /usr/bin/vmtoolsd
#root       3051  0.1  0.0 [xfsaild/dm-0]
#root          1  0.0  0.2 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
#root          2  0.0  0.0 [kthreadd]
#root          3  0.0  0.0 [ksoftirqd/0]


ps -eo user,pid,pcpu,pmem,args --sort=-pmem  |head -n 10

#USER        PID %CPU %MEM COMMAND
#mysql     12597  0.3 23.4 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf
#named      6614  0.0  5.2 /usr/sbin/named -u named -c /etc/named.conf
#root       6568  0.0  0.8 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
#root       6590  0.0  0.7 /usr/sbin/libvirtd
#polkitd    6206  0.0  0.5 /usr/lib/polkit-1/polkitd --no-debug
#root       6580  0.0  0.5 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
#root       6575  0.0  0.3 /usr/sbin/rsyslogd -n
#root       6286  0.0  0.3 /usr/sbin/ModemManager
#root       3132  0.0  0.3 /usr/lib/systemd/systemd-journald

Automatically publish Java projects (Tomcat)

#!/bin/bash
DATE=$(date +%F_%T)

TOMCAT_NAME=$1
TOMCAT_DIR=/usr/local/$TOMCAT_NAME
ROOT=$TOMCAT_DIR/webapps/ROOT

BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=tomcat-java-demo

# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
   git clone https://github.com/lizhenliang/tomcat-java-demo
   cd $PROJECT_NAME
else
   cd $PROJECT_NAME
   git pull
fi

# 构建
mvn clean package -Dmaven.test.skip=true
if [ $? -ne 0 ]; then
   echo "maven build failure!"
   exit 1
fi

# 部署
TOMCAT_PID=$(ps -ef |grep "$TOMCAT_NAME" |egrep -v "grep|$$" |awk 'NR==1{print $2}')
[ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
[ -d $ROOT ] && mv $ROOT $BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
unzip $WORK_DIR/$PROJECT_NAME/target/*.war -d $ROOT
$TOMCAT_DIR/bin/startup.sh


Automatically publish PHP project scripts

#!/bin/bash
# QQ学员群: 545214087 , 微信学员群请加阿良老师微信邀请您: olizhenliang

#2020-10-22_14:17:11
DATE=$(date +%F_%T)

WWWROOT=/usr/local/nginx/html/$1


BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=php-demo


# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
   git clone https://github.com/lizhenliang/php-demo
   cd $PROJECT_NAME
else
   cd $PROJECT_NAME
   git pull
fi


# 部署
if [ ! -d $WWWROOT ]; then
   mkdir -p $WWWROOT
   rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
else
   rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
fi

part 2 -END

The content of the script refers to online materials, analyzes and tests by yourself

Reference: https://blog.csdn.net/heian_99/category_9675115.html

Ara

Guess you like

Origin blog.csdn.net/Nightwish5/article/details/109442674