工作中实用的Shell脚本实例
转自:https://www.jianshu.com/p/093d712c777d
1. 扫描主机端口状态
#!/bin/bash
HOST=$1
PORT="22 80 8080 3306"
for PORT in $PORT; do
if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
echo "$PORT open"
else
echo "$PORT close"
fi
done
2. 代码上线脚本
#!/bin/bash
# code online
# author: ren
PROJT_DIR=/usr/local/nginx/html
OLD_DIR=/usr/local/nginx/html/web1
PROJT=web1
BACKUP_DIR=/data/backup
DATA_CHMOD=www
DATE=`date +%F`
NEW_DIR=/data/web1
# 关闭nginx
function stop_nginx() {
/usr/bin/systemctl stop nginx
if [ $? -eq 0 ];then
echo "nginx is stopd"
else
echo "nginx is not stop please check..."
exit 1
fi
}
#2 备份原有数据
function backup_data() {
if [ -d $BACKUP_DIR/$DATE'-'$PROJT ];then
echo "DIR $BACKUP_DIR/$DATE'-'$PROJT is exist"
exit 2
else
mv $OLD_DIR $BACKUP_DIR/$DATE'-'$PROJT
fi
}
# 3移动新的代码 项目目录 注:此代码目录需手动上传解压
function new_code() {
if [ -d $NEW_DIR ];then
mv $NEW_DIR $PROJT_DIR
else
echo "NEW_DIR is not exist"
exit 3
fi
}
# 4 修改权限
function chmod_news() {
chown -R $DATA_CHMOD.$DATA_CHMOD $OLD_DIR
}
# 5 启动服务
function start_nginx() {
/usr/bin/systemctl start nginx
if [ $? -eq 0 ];then
echo "nginx start ok"
else
echo "ngin is not start,please check..."
fi
}
stop_nginx
backup_data
new_code
chmod_news
start_nginx
3. 检测MySQL主从复制是否异常
#!/bin/bash
user="root"
password="123456"
mycmd="mysql -u$user -p$password -h 192.168.1.88"
function chkdb() {
list=($($mycmd -e "show slave status \G"|egrep "Running|Behind"|awk -F: '{print $2}'))
if [ ${list[0]} = "Yes" -a ${list[1]} = "Yes" -a ${list[2]} -lt 120 ]
then echo "Mysql slave is ok"
else echo "Mysql slave replation is filed"
fi
}
function main() {
while true
do chkdb
sleep 3
done
}
main
4. MySQL数据库备份脚本(mysqldump)
#!/bin/bash
#删除15天以前备份
source /etc/profile #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset #引用未初始化变量时退出
#set -o errexit #执行shell命令遇到错误时退出
user="root"
password="123456"
host="localhost"
port="3306"
#需备份的数据库,数组
db=("test")
#备份时加锁方式,
#MyISAM为锁表--lock-all-tables,
#InnoDB为锁行--single-transaction
lock="--single-transaction"
mysql_path="/usr/local/mysql"
backup_path="${mysql_path}/backup"
date=$(date +%Y-%m-%d_%H-%M-%S)
day=15
backup_log="${mysql_path}/backup.log"
#建立备份目录
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
#删除以前备份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
echo "开始备份数据库:${db[*]}"
#备份并压缩
backup_sql(){
dbname=$1
backup_name="${dbname}_${date}.sql"
#-R备份存储过程,函数,触发器
mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name
if [[ $? == 0 ]];then
cd $backup_path
tar zcpvf $backup_name.tar.gz $backup_name
size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
rm -rf $backup_name
echo "$date 备份 $dbname($size) 成功 "
else
cd $backup_path
rm -rf $backup_name
echo "$date 备份 $dbname 失败 "
fi
}
#循环备份
length=${#db[@]}
for (( i = 0; i < $length; i++ )); do
backup_sql ${db[$i]} >> $backup_log 2>&1
done
echo "备份结束,结果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端