监控100台服务器磁盘利用率脚本
#!/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
监控MySQL主从同步状态是否异常脚本
#!/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" xxx@163.com
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
目录文件变化监控和实时文件同步
#!/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" xxx@163.com
done
#这里的写法太简单了。就只监控了 create
批量创建100用户并设置密码脚本
#!/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
批量检测网站是否异常脚本
#!/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
批量主机远程执行命令脚本
#!/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
一键部署LNMP网站平台脚本
#!/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的过程的?
一键查看服务器资源利用率
#!/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
#
找出占用CPU 内存过高的进程脚本
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
自动发布Java项目(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
自动发布PHP项目脚本
#!/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
脚本内容参考网上资料,自己做分析,实验测试
参考:https://blog.csdn.net/heian_99/category_9675115.html
阿良