脚本
部署后端
bash
#!/bin/bash
api_dir=/opt/temper/
api_jar=service-api.jar
api_all=$api_dir"$api_jar"
api_up=/opt/temper/upgrade/service-api.jar
cmc_dir=/opt/temper/
cmc_jar=service-cmc.jar
cmc_all=$cmc_dir"service-cmc.jar"
cmc_up=/opt/temper/upgrade/service-cmc.jar
gateway_dir=/opt/temper/
gateway_jar=service-gateway.jar
gateway_all=$gateway_dir"service-gateway.jar"
gateway_up=/opt/temper/upgrade/service-gateway.jar
process_dir=/opt/temper/
process_jar=service-process.jar
process_all=$process_dir"service-process.jar"
process_up=/opt/temper/upgrade/service-process.jar
dist_dir=/opt/temper/
dist_up=/opt/temper/upgrade/dist
if test -f "$api_up"; then
cd $api_dir
PID=$(ps -ef | grep $api_jar | grep -v grep | awk '{ print $2 }')
kill -9 $PID
mv service-api.jar service-api.jar_$(date +"%Y-%m-%d_%H:%M:%S")
mv $api_up $api_dir
nohup /usr/local/java/bin/java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8 $api_all >/dev/null 2>&1 &
echo $api_jar update success!
else
echo "$api_up not exist"
fi
if test -f "$process_up"; then
cd $process_dir
PID=$(ps -ef | grep $process_jar | grep -v grep | awk '{ print $2 }')
kill -9 $PID
mv service-process.jar service-process.jar_$(date +"%Y-%m-%d_%H:%M:%S")
mv $process_up $process_dir
nohup /usr/local/java/bin/java -Xms450m -Xmx450m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8 $process_all >/dev/null 2>&1 &
echo $process_jar update success!
else
echo "$process_up not exist"
fi
if test -f "$cmc_up"; then
cd $cmc_dir
PID=$(ps -ef | grep $cmc_jar | grep -v grep | awk '{ print $2 }')
kill -9 $PID
mv service-cmc.jar service-cmc.jar_$(date +"%Y-%m-%d_%H:%M:%S")
mv $cmc_up $cmc_dir
nohup /usr/local/java/bin/java -Xms450m -Xmx450m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8 $cmc_all >/dev/null 2>&1 &
echo $cmc_jar update success!
else
echo "$cmc_up not exist"
fi
if test -f "$gateway_up"; then
cd $gateway_dir
PID=$(ps -ef | grep $gateway_jar | grep -v grep | awk '{ print $2 }')
kill -9 $PID
mv service-gateway.jar service-gateway.jar_$(date +"%Y-%m-%d_%H:%M:%S")
mv $gateway_up $gateway_dir
nohup /usr/local/java/bin/java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8 $gateway_all >/dev/null 2>&1 &
echo $gateway_jar update success!
else
echo "$gateway_up not exist"
fi
if [ -d "$dist_up" ];then
cd $dist_dir
mv dist dist_$(date +"%Y-%m-%d_%H:%M:%S")
mv $dist_up $dist_dir
echo dist update success!
else
echo "$dist_up not exist"
fi
count=`ps aux | grep service-api | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-api is run"
else
echo "service-api not run"
fi
count=`ps aux | grep service-cmc | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-cmc is run"
else
echo "service-cmc not run"
fi
count=`ps aux | grep service-process | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-process is run"
else
echo "service-process not run"
fi
count=`ps aux | grep service-gateway | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-gateway is run"
else
echo "service-gateway not run"
fi
部署前端
脚本功能:
- 备份原文件夹,压缩成带时间戳的文件放到
bak
目录 - 清空原目录
- 拷贝新文件
- 显示简单进度提示
假设目录结构如下:
- 原目录:
/usr/local/nginx/html/cool
- 新文件:
/root/upWebCool
- 备份目录:
/usr/local/nginx/html/bak
bash
#!/bin/bash
# 颜色定义
GREEN="\033[32m"
YELLOW="\033[33m"
RESET="\033[0m"
# 目标目录
TARGET_DIR="/usr/local/nginx/html/cool"
# 备份目录(假设已经存在)
BACKUP_DIR="/usr/local/nginx/html/bak"
# 新部署文件目录
SOURCE_DIR="/root/upWebCool"
# 时间戳
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
echo -e "${GREEN}开始备份 ${YELLOW}$TARGET_DIR${GREEN} ...${RESET}"
if [ -d "$TARGET_DIR" ] && [ -n "$(ls -A "$TARGET_DIR")" ]; then
BACKUP_FILE="$BACKUP_DIR/cool_backup_$TIMESTAMP.tar.gz"
tar -czf "$BACKUP_FILE" -C "$TARGET_DIR" .
echo -e "${GREEN}备份完成:${YELLOW}$BACKUP_FILE${RESET}"
else
echo -e "${GREEN}目录 ${YELLOW}$TARGET_DIR${GREEN} 为空或不存在,跳过备份${RESET}"
fi
# 安全删除目标目录下的内容(带进度条)
if [ -d "$TARGET_DIR" ] && [ -n "$(ls -A "$TARGET_DIR")" ]; then
echo -e "${GREEN}开始清理 ${YELLOW}$TARGET_DIR${GREEN} 下的文件和子目录...${RESET}"
FILES=("$TARGET_DIR"/* "$TARGET_DIR"/.*)
TOTAL=${#FILES[@]}
COUNT=0
for f in "${FILES[@]}"; do
# 排除 . 和 ..
[[ "$(basename "$f")" == "." || "$(basename "$f")" == ".." ]] && continue
rm -rf "$f"
COUNT=$((COUNT + 1))
PERCENT=$((COUNT * 100 / TOTAL))
echo -ne "${GREEN}清理进度: [${PERCENT}%] ${YELLOW}$f${RESET}\r"
done
echo -e "\n${GREEN}清理完成。${RESET}"
else
echo -e "${GREEN}目录 ${YELLOW}$TARGET_DIR${GREEN} 为空,跳过清理${RESET}"
fi
# 拷贝新部署文件(带进度条)
if [ -d "$SOURCE_DIR" ] && [ -n "$(ls -A "$SOURCE_DIR")" ]; then
echo -e "${GREEN}开始部署新文件...${RESET}"
FILES=("$SOURCE_DIR"/*)
TOTAL=${#FILES[@]}
COUNT=0
for f in "${FILES[@]}"; do
cp -r "$f" "$TARGET_DIR"/
COUNT=$((COUNT + 1))
PERCENT=$((COUNT * 100 / TOTAL))
echo -ne "${GREEN}部署进度: [${PERCENT}%] ${YELLOW}$f${RESET}\r"
done
echo -e "\n${GREEN}部署完成。${RESET}"
# 清空 SOURCE_DIR 下的文件(带进度条)
echo -e "${GREEN}清空源目录 ${YELLOW}$SOURCE_DIR${GREEN} ...${RESET}"
FILES=("$SOURCE_DIR"/* "$SOURCE_DIR"/.*)
TOTAL=${#FILES[@]}
COUNT=0
for f in "${FILES[@]}"; do
[[ "$(basename "$f")" == "." || "$(basename "$f")" == ".." ]] && continue
rm -rf "$f"
COUNT=$((COUNT + 1))
PERCENT=$((COUNT * 100 / TOTAL))
echo -ne "${GREEN}清空进度: [${PERCENT}%] ${YELLOW}$f${RESET}\r"
done
echo -e "\n${GREEN}源目录已清空。${RESET}"
else
echo -e "${GREEN}源目录 ${YELLOW}$SOURCE_DIR${GREEN} 为空,未部署任何文件${RESET}"
fi
echo -e "${GREEN}前端部署完成!${RESET}"
使用方法
保存为
deploy.sh
给执行权限:
chmod +x deploy.sh
执行部署:
./deploy.sh
换行报错
使用 VSCode 或编辑器保存为 LF(Unix)格式
bash
打开 run_up_web.sh
在右下角选择 LF 而不是 CRLF
保存后再执行
bash run_up_web.sh
sh run_up_web.sh
文件大小
du:磁盘使用情况 -s:只显示总计 -h:人类可读
ts
// 查看目录大小
du -sh /path/to/directory
du -sh /usr/local/nginx/html/cool
ts
// 查看目录下每个文件和子目录的大小
du -sh /usr/local/nginx/html/cool/*
//查看当前目录下所有文件和目录大小排序
du -sh * | sort -h
日志监控
服务状态
bash
#!/bin/sh
# 查询软件依赖的全部中间件的启动状态
echo "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆Begin☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"
echo "--------------------------------start check middleware--------------------------------"
# mysql
count=`lsof -i tcp:3308 | grep -v "TYPE" | wc -l`
if [ $count -ne 0 ]; then
echo "mysql is run"
else
echo "mysql not run | systemctl start mysql8 "
fi
# redis
count=`ps aux | grep redis-server | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "redis is run"
else
echo "redis not run | "
fi
# nginx
count=`ps aux | grep nginx | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "nginx is run"
else
echo "nginx not run"
fi
# influxdb
count=`lsof -i tcp:8086 | grep -v "TYPE" | wc -l`
if [ $count -ne 0 ]; then
echo "influxdb is run"
else
echo "influxdb not run"
fi
# TDengine
for i in app33 app34 app35
do
ssh $i "count=`ps aux | grep taosd | grep -v 'grep' | wc -l`; if [ $count -ne 0 ]; then echo '$i,TDengine is run'; else echo 'TDengine not run'; fi"
done
# Rabbitmq
count=`ps aux | grep rabbitmq | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "Rabbitmq is run"
else
echo "Rabbitmq not run"
fi
# RocketMq
count=`ps ef | grep rocketmq | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "RocketMq is run"
else
echo "RocketMq not run"
fi
# Nacos
for i in app33 app34 app35
do
ssh $i "count=`ps aux | grep nacos | grep -v 'grep' | wc -l`; if [ $count -ne 0 ]; then echo '$i,nacos is run'; else echo 'nacos not run'; fi"
done
# xxl-job
count=`lsof -i tcp:8085 | grep -v "TYPE" | wc -l`
if [ $count -ne 0 ]; then
echo "xxl-job is run"
else
echo "xxl-job not run"
fi
# Zabbix
count=`lsof -i tcp:9300 | grep -v "TYPE" | wc -l`
if [ $count -ne 0 ]; then
echo "Zabbix is run"
else
echo "Zabbix not run"
fi
echo "--------------------------------start check switch-service app--------------------------------"
# switch-service
count=`ps aux | grep switch-service | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "switch-service is run"
else
echo "switch-service not run"
fi
echo "--------------------------------start check temper-service app--------------------------------"
count=`ps aux | grep service-api | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-api is run"
else
echo "service-api not run"
fi
count=`ps aux | grep service-cmc | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-cmc is run"
else
echo "service-cmc not run"
fi
count=`ps aux | grep service-process | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-process is run"
else
echo "service-process not run"
fi
count=`ps aux | grep service-gateway | grep -v "grep" | wc -l`
if [ $count -ne 0 ]; then
echo "service-gateway is run"
else
echo "service-gateway not run"
fi
echo "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆End☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"
设备状态
bash
#!/bin/bash
#系统简单巡检
cpu() {
#us+sy 用户和系统进程消耗cpu百分比之和
check_cpu=$(vmstat|awk '{if(NR==3) print$13+$14}')
#磁盘io响应使用率
check_io=$(vmstat|awk '{if(NR==3) print$16}')
echo "CPU使用率为$check_cpu%, 磁盘io响应率为$check_io%"
}
memory() {
#总内存,printf 是输出命令 %f格式化为小数,%.1f是后面保留1位小数。如: 1.0,这里/1024是将以G为单位显示
total=$(free -m|awk '{if(NR==2)printf "%.1f",$2/1024 }')
#内存使用量=总量-可用
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"
}
disk() {
#只看根分区/ 和boot分区。所以要awk去匹配文件系统为/dev/开头的,下面devlist输出/,/boot
#$1代表分区列,如/dev/sda1 $NF-最后一列(代表挂载点一列)如/ /boot
devlist=$(df -h|awk '/^\/dev/{print $1}')
for i in $devlist
do
mouted=$(df -h|awk -v i=$i '$1==i{print $NF}')
size=$(df -h|awk -v i=$i '$1==i{print $2}')
used=$(df -h|awk -v i=$i '$1==i{print $3}')
use_free=$(df -h|awk -v i=$i '$1==i{print $5}')
echo "硬盘信息- 挂载点: $mouted, 总大小: $size,已使用: $used,使用率:$use_free "
done
}
tcp() {
#$6是连接数那一列,将状态名存入awk设定的数组中作为key,数组取名s。++代表每遇到一个key,它的value会累加1,END结束,循环输出键值。
netstat -antp|awk '{s[$6]++}END{for (i in s) print i,"当前连接数为" s[i]}'
}
main() {
echo "——————————————————————————————【巡检开始】————————————————————————————"
echo "☆☆☆☆☆☆☆☆☆☆CPU信息☆☆☆☆☆☆☆☆☆☆"
cpu
echo "☆☆☆☆☆☆☆☆☆☆内存信息☆☆☆☆☆☆☆☆☆☆"
memory
echo "☆☆☆☆☆☆☆☆☆☆磁盘信息☆☆☆☆☆☆☆☆☆☆"
disk
echo "☆☆☆☆☆☆☆☆☆☆TCP连接状态☆☆☆☆☆☆☆☆☆☆"
tcp
echo "——————————————————————————————【巡检结束】————————————————————————————"
}
main
启动所有中间件
bash
#!/bin/sh
# 启动软件依赖的全部中间件
echo "--------------------------------start beg--------------------------------"
cd /
chmod -R 777 opt
# mysql
echo "check mysql"
count=`lsof -i tcp:3308 | grep -v "TYPE" | wc -l`
echo $count
if [ $count -ne 0 ]; then
echo "mysql is run"
else
systemctl start mysql8&
fi
echo ""
# redis
echo "check redis"
count=`lsof -i tcp:6379 | grep -v "TYPE" | wc -l`
echo $count
if [ $count -ne 0 ]; then
echo "redis is run"
else
redis-server /etc/redis.conf &
fi
echo ""
# rabbitmq
echo "check rabbitmq"
count=`lsof -i tcp:15672 | grep -v "TYPE" | wc -l`
echo $count
if [ $count -ne 0 ]; then
echo "rabbitmq is run"
else
systemctl start rabbitmq-server.service
fi
echo ""
# influxdb
echo "check influxdb"
count=`lsof -i tcp:8086 | grep -v "TYPE" | wc -l`
echo $count
if [ $count -ne 0 ]; then
echo "influxdb is run"
else
systemctl start influxdb
fi
sleep 10
sh ./check.sh
同步集群节点
bash
#!/bin/bash
# 同步文件或目录到其他节点
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in app33 app34 app35
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
启动rocketmq
bash
#!/bin/bash
case $1 in
"start"){
for i in app34 app35
do
echo " --------启动 $i rocketmq-------"
ssh $i "service rocketmq start "
done
nohup java -jar /opt/module/rocketmq-console/rocketmq-dashboard.jar >./rocketmq-dashboard.log 2>&1 &
};;
"stop"){
PID=$(ps -ef | grep rocketmq-dashboard.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
echo rocketmq-dashboard is already stopped
else
echo kill -9 $PID
kill -9 $PID
fi
for i in app34 app35
do
echo " --------停止 $i rocketmq-------"
ssh $i "service rocketmq stop "
done
};;
"restart"){
for i in app34 app35
do
echo " --------重启 $i rocketmq-------"
ssh $i "service rocketmq restart "
done
};;
esac
echo " --------over-------"