rocky9 编写一键安装mysql 的sh脚本

news2024/10/5 14:19:56

基本操作步骤

1、虚拟机最小化安装rocky9系统,安装后克隆一个系统;1个用来获取下载的rpm包,一个用来编写sh 测试脚本;

2、修改虚拟机的 yum配置文件,获取获取rpm程序 :启用缓存,并修改yum下载软件的路径;

3、参考教程安装,安装mysql;

Centos(rocky) yum 安装mysql,切换路径、优化配置并设置开机自启_服务器开机自启mysql-CSDN博客文章浏览阅读2.5k次。1、安装方式介绍mysql安装共3中方式1)yum安装,最简单的方式2)rpm包安装,切记下载相应系统的 稳定版 源码包,相对较简单3)压缩包安装:自由度高,但配置相应复杂,且需要自己注册自启服务注:1,2,3无法在一台机器上共存,1,2可以通过mulit-mysql启动多个服务看,但无法实现:单机上的myql主从只有3方式支持1台安装多个mysql服务,实现mysql主从一、安装步骤1.获取最新的yum rmp包地址下载地址:MySQL :: MySQL Commu_服务器开机自启mysqlhttps://blog.csdn.net/qq_26408545/article/details/124114793?spm=1001.2014.3001.5502

4、将安装后缓存的rpm包下载下来,并打tar.gz包,并传至指定路径;

5、编写自动化安装mysql sh脚本;

6、测试运行一键安装命令

附录

        1)rpm及编写的脚本(本教程的centos7、rocky9.3)

        2)centos7 自动化 mysql、redis、nginx、jdk、rabbitMq、syslog程序的soft.sh脚本

你可能用到的编写sh 脚本的参考:

        1)下教程包含:1)中文字体,2)jdk  3)java依赖及时间同步器 ;4)nginx ; 5)redis

springboot vue 部署至Rocky(Centos)并能断电自启动,本文部署是若依应用-CSDN博客文章浏览阅读400次。安装中文字体(防止中文乱码)3、安装chrony(保证分布式部署时间的一致性)5、安装mysql数据,迁移目录,并授权自启动;6、安装redis,并设置自动动;7、安装nginx,并设置自启动;8、部署jar包,并设置自启动;参考教程Rocky(Centos)挂在磁盘_小云小白的博客-CSDN博客6、编辑 /etc/fstab 文件,最后添加单行。7、重启,并查看挂在磁盘是否仍在。发现/dev/vdb未挂载。2、对此系统可用磁盘。4、新建data路径。https://blog.csdn.net/qq_26408545/article/details/132690191        2)这边centos7 安装rabbitMq参考

centos7.6安装rabbitMq3.11.10和erlang25_centos rabbitmq 3.11 安装-CSDN博客文章浏览阅读1.7k次,点赞3次,收藏6次。解压后,上传到目录/usr/lib/rabbitmq/lib/rabbitmq_server-3.11.10/plugins。此时根据信息,打开/usr/lib/rabbitmq/bin/rabbitmq-server:(根据个人实际情况)应是rabbitqmq找不到erlang的安装环境,导致启动失败。用默认的账号密码【guest/guest】登录出现权限问题。当前目录:/usr/local/software。在最后加上下面两句话,路径根据自己配置的写。访问:http://ip:15672/_centos rabbitmq 3.11 安装https://blog.csdn.net/weixin_44142888/article/details/129549426        3)安装 syslog 参考

centos搭建简单自用syslog服务器_centos syslog-CSDN博客文章浏览阅读3.7k次,点赞5次,收藏22次。centos搭建简单自用syslog服务器_centos sysloghttps://blog.csdn.net/weixin_44270742/article/details/130101096

1、虚拟机最小化安装rocky9系统

参考:vmware安装 Rocky9(自定义分区安装),并开启服务器监控-CSDN博客文章浏览阅读1.1k次,点赞3次,收藏4次。目前市面上cpu现成:基本是4~32不等;这里配置6个占一半;例如:磁盘总大小360G :1、先添加/boot:2Gib;2、再添加swap(2Gib可以4Gib交换区,超过这个一律一样大,前面没有反斜杠)3、再添加/data挂在盘300Gib;4、在添加系统跟路径:/;大小不设置会占用所有剩余空间;然后点击上面的完成按钮;磁盘分区知识:/boot 系统引导区域;swap内存交换区-跟你的内存一样大最好。_rocky9https://blog.csdn.net/qq_26408545/article/details/133963090

1)最小化安装

2)存盘一定是标准分区(设备类型均为:标准分区。如下图);不要自动化磁盘:就4个用途路径

3)安装后克隆1台虚拟机(标准分区的可直接克隆)

2、修改yum 文件,开启缓存配置(其中一台1台)

修改 /etc/yum.conf 文件,添加

#是否缓存
keepcache=1
#缓存路径
cachedir=/root/cache/yum

3、参考教程安装,安装mysql;

教程如下

rocky(Centos) yum 安装mysql,切换路径、优化配置,不关SELINUX 并设置开机自启_服务器开机自启mysql-CSDN博客文章浏览阅读2.5k次。1、安装方式介绍mysql安装共3中方式1)yum安装,最简单的方式2)rpm包安装,切记下载相应系统的 稳定版 源码包,相对较简单3)压缩包安装:自由度高,但配置相应复杂,且需要自己注册自启服务注:1,2,3无法在一台机器上共存,1,2可以通过mulit-mysql启动多个服务看,但无法实现:单机上的myql主从只有3方式支持1台安装多个mysql服务,实现mysql主从一、安装步骤1.获取最新的yum rmp包地址下载地址:MySQL :: MySQL Commu_服务器开机自启mysqlhttps://blog.csdn.net/qq_26408545/article/details/124114793查找yum 下载的程序rpm包;

4、将安装后缓存的rpm包下载下来,并打tar.gz包,并传至指定路径;

1)将缓存文件,按如图方式放置在文件夹下;

这里我是安装后,查了一下mysql 版本8.0.36:

其中:1)base放的是mysql的安装包,2)depend-rpm:防止的是其他依赖包,3)config:是mysql的配置文件(未优化过的);

不参与sh脚本的:1)base-yum不参与sh脚本,是从mysql 拿到的 yum的rpm包;2)readMe.txt:内部使用的简单说明

2)将其打成tar.gz 用于 脚本安装的依赖程序包

用的软件压缩的tar.gz :1)先压缩 tar;2)再把tar 压过 gzip,得到 tar.gz 文件

Windows如何将文件压缩成.tar.gz的格式_windows压缩tar.gz文件-CSDN博客文章浏览阅读1.9w次,点赞13次,收藏38次。我们平时使用Linux和Windows系统相互传文件的时候,使用rar或者zip的压缩文件往往不是很方便,tar.gz是Linux和Unix下面比较常用的格式,那么如何再Windows下将文件压缩成tar.gz的格式呢?这时候,我们会得到一个tar文件,容易发现,tar文件的大小并未发生明显变化,这是因为tar实际上只是对文件进行简单的打包。5.接下来我们将刚才得到的tar文件“添加到压缩包”,如下图所示,选择压缩格式下选择“gzip”格式,即可得到tar.gz的压缩文件啦。..._windows压缩tar.gz文件https://blog.csdn.net/YSL_Lsy_/article/details/1259961523)将其上传至 /opt/soft,新建文件夹和切换路径如下:

mkdir -p /opt/soft
cd /opt/soft

将文件上传路径,如图

5、编写自动化安装mysql sh脚本; 

如上图,上传指定路径

soft.sh 脚本内容

#!/bin/bash
# 项目部署基础路径
BASE_PATH="/usr/local"

# 压缩包名
TAR_GZ_NAME="centos9.3-rpm.tar.gz"

# 压缩包和脚本的发布路径
PUSH_SH_PATH="/opt/soft"

# 解压路径
UNZIP_TEMP_PATH="/usr/local/soft_unzip"

# 1.1 使用的账号
MYSQL_USER="root"
# 1.2 数据库密码
MYSQL_PWD="123456"
# 1.3 自动创建数据库名称
MYSQL_CREATE_DB_NAME="test_db"

# 2 开放防火墙端口
open_ports=("3306")
#-------------------往下为不建议调整参数--------------------
#参数1:操作类型
operate="$1"
#可选参数2 指定安装的软件
soft="$2"

# 发布压缩包 解压后路径(会在解压后确定)
PUSH_TEMP_PATH=""

# 检测的java_home位置的变量
JAVA_HOME=""

# 中文字体路径
FONT_PATH="/usr/share/fonts/chinese"

# 系统服务所在路径
SYS_SERVICE_PATH="/etc/systemd/system"

# 空数组:存储汇总日志
log_array=()
# 临时日志变量
LOG_TEMP_LOG=""

#使用说明,用来提示输入参数
usage() {
    echo "脚本可选通用命令:"
	echo " ● 安装 1) sh soft.sh push 参数2:可选项[mysql],无第二个参数,安装所有-需确认,all:安装所有-无需确认;"
	echo " ● 卸载 2)sh soft.sh remove 参数2:可选项[mysql],无第二个参数:卸载所有;"
	echo " ● 日志 3)sh soft.sh log 参数2:可选项[mysql],无第二个参数:查看所有;"
	
	echo " ● -- 参数 2 概述:"
	echo " ●      1、mysql:mysql-8.0.36"
    exit 1
}

#建立相关文件夹并注册自启动服务
push(){
	#解压tar包
	un_tar_gz
	
	# 如果未指定安装软件
	if [ -z "${soft}" ]; then
	
		# 1、安装 mysql
		while true; do
			# 1 提示用户输入(y or n)
			read -p "3、do you want to install mysql-8.0.36 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				mysql_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:3、mysql-8.0.36 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
	else
		case "$soft" in
			"mysql")
				mysql_install
				;;
			"all")
				# 1、安装 mysql
				mysql_install
				;;
		esac
	fi
	
	#删除解压的文件
	rm -rf $UNZIP_TEMP_PATH
	# 开放防火墙
	firewall_port_open
	# 调优系统配置
	sys_com_tuning
	
	# 8、打印汇总日志
	if [ -z "${soft}" ] ||[ "${soft}" = "all" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: end of install exe;"
}

# 卸载服务结束
remove(){
	# 关闭防火墙(应用不在时,有警告,需在最前面)
	firewall_port_close
	
	# 1、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_remove
	fi
	
	# 2、打印汇总日志
	if [ -z "${soft}" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: 卸载命令执行结束;"
}

#日志
log(){
    
	# 1、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_log
	fi
	
	# 2、 打印汇总日志
	if [ -z "${soft}" ]; then
		pirnt_sum_log
	fi
}

mysql_install(){
	# 1、安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/depend-rpm
	yum -y localinstall *.rpm
	
	# 2.1 添加mysql用户组
	groupadd mysql
	#2.2 用户组添加用户
	useradd -g mysql mysql
	
	# 3 安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/base
	yum -y localinstall *.rpm
	
	# 4 执行初始化并指定密码
	/usr/sbin/mysqld --initialize --user=mysql --lower-case-table-names=1
	
	# 5 备份并修改配置
	rm -rf /etc/my.cnf.bak
	cp -rf /etc/my.cnf /etc/my.cnf.bak
	# 5.1 替换mysql 配置文件
    cat $PUSH_TEMP_PATH/mysql-8.0.36/conf/my.cnf > /etc/my.cnf
	
	# 启动MySQL服务  
	echo "正在启动MySQL服务..."  
	sudo systemctl start mysqld  
	  
	# 等待MySQL服务启动完成   
	sleep 5
	
	# 获取默认密码
	DEFAULT_PASSWORD=$(sudo grep 'A temporary password' /var/log/mysqld.log | awk '{print $NF}')

	# 使用mysqladmin修改密码
	mysqladmin -u root -p"${DEFAULT_PASSWORD}" password "$MYSQL_PWD"

	# 重启MySQL服务
	sudo systemctl restart mysqld

	# 等待启动完成,导入数据(空库可以启动快)   
	sleep 5
	# 连接到MySQL数据库服务器并创建数据库 
	mysql -u"root" -p"$MYSQL_PWD" -e "CREATE DATABASE ${MYSQL_CREATE_DB_NAME}"
	
	# 开启远程访问
	mysql_open_remote
	
	echo " ● end install: mysql-8.0.36;"
	
	# 显示 mysql 状态
	mysql_log
}

mysql_remove(){
	# 1 如果未安装mysql,则退出
	mysqld_install_status=`systemctl list-unit-files | grep mysqld`
	if [ -z "${mysqld_install_status}" ]; then
		return
	fi
	
	# 停止MySQL服务  
	systemctl stop mysqld  
	  
	# 卸载MySQL软件包及其依赖项  
	yum remove -y mysql mysql-server mysql-libs mysql-client-plugins mysql-common
	  
	# 删除MySQL数据目录和配置文件(请谨慎操作)  
	rm -rf /var/lib/mysql 
	rm -rf /etc/my.cnf
	rm -rf /etc/my.cnf.bak
	rm -rf /var/log/mysqld.log
	
	mysql_log
	echo " ● end remove: mysql-8.0.36;"
}

mysql_log(){
	# 1 检测 mysql 是否自启动
	MYSQL_STATUS=$(systemctl is-active mysqld)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 mysql 状态为:活跃的,打印成功,否则打印失败
		if [ "${MYSQL_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 mysql 状态为不存在 或者失败
		if [ "${MYSQL_STATUS}" = "unknown" ] || [ "${MYSQL_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 mysql,或者查看指定查看 mysql 日志,则显示日志
	if [ "${soft}" = "mysql" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/mysqld.log
	fi
}

mysql_imp_sql(){
	SQL_FILE="${PUSH_TEMP_PATH}/mysql-8.0.36/conf/initDb.sql"
	if [ -e "$SQL_FILE" ]; then
		mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" $MYSQL_CREATE_DB_NAME < "$SQL_FILE"
		log_array+=(" ● 执行 mysql 数据数据化。")
		echo " ● 执行 mysql 数据数据化。" 
	else
		log_array+=(" ● 发布包不含 mysql 数据库初始化脚本。")
		echo " ● 发布包不含 mysql 数据库初始化脚本。" 
	fi
}

# mysql 开放远程访问
# 防火墙还未开放(在防火墙内操作)
mysql_open_remote(){
	echo " ● 配置mysql 可以远程访问"
	# 开放远程访问
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PWD}'"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "FLUSH PRIVILEGES;"
}

# mysql 关闭远程远程访问
# 防火墙还未开放(在防火墙内操作)
mysql_close_remote(){
	#关闭防火墙
	echo " ● 配置mysql 关闭远程访问;"
	# 开放远程访问
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "REVOKE ALL PRIVILEGES ON *.* FROM '${MYSQL_USER}'@'%';"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "DROP USER '${MYSQL_USER}'@'%'"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "FLUSH PRIVILEGES;"
}

#解压tar包
un_tar_gz(){
	#1 删除可能存在的解压不全的临时文件
	rm -rf $UNZIP_TEMP_PATH
	
	#2 创建加压的文件夹
	mkdir -p $UNZIP_TEMP_PATH

	#2 进行解压操作
	tar -zxvf $PUSH_SH_PATH/$TAR_GZ_NAME -C $UNZIP_TEMP_PATH 
	
	#3 获取加压后的文件路径
	#UNZIP_DIR_NAME=$(echo "$UNZIP_TEMP_PATH"/* | awk '{print $1}' | xargs basename)
	UNZIP_DIR_NAME=$(tar -tzf "$PUSH_SH_PATH"/"$TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	#4 获取到解压后的真实路径
	PUSH_TEMP_PATH=$UNZIP_TEMP_PATH/$UNZIP_DIR_NAME
}

#打印中途记录的在log_array内的内容
pirnt_sum_log(){
	# 打印数组的每个元素
	echo "-----------------------summary-log-start------------------------------"
	for element in "${log_array[@]}"; do
		echo "$element"
	done
	echo "-----------------------summary-log-end ------------------------------"
}

#防火墙开放端口
firewall_port_open(){

	# 定义要检查的端口号
	PORT=88
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi

	echo "调整 firewall 防火墙:"
	firewall-cmd --zone=public --add-port=88/tcp --permanent
	firewall-cmd --zone=public --add-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙开放端口
firewall_port_open(){
	# 检查端口是否已经开放
	PORT=$open_ports[0]
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi
	
	#循环开放端口
	for open_port in "${open_ports[@]}"
	do
		echo "开放firewall 防火墙-端口:${open_port}"
		firewall-cmd --zone=public --add-port=${open_port}/tcp --permanent
	done
	firewall-cmd --reload
	# 防火墙日志
	firewall_port_log
}

#防火墙关闭端口
firewall_port_close(){
	for open_port in "${open_ports[@]}"
	do
		echo "关闭firewall 防火墙-端口:${open_port}"
		firewall-cmd --zone=public --remove-port=${open_port}/tcp --permanent
	done
	firewall-cmd --reload
	# 防火墙日志
	firewall_port_log
}

#防火墙日志
firewall_port_log(){
	open_ports=$(firewall-cmd --list-ports)
	LOG_TEMP_LOG=" ● firewall-cmd open port:${open_ports}"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

# 系统调优(RedHat系列linux)
sys_com_tuning(){
	
	# 搜索文件中是否包含指定文本
   if grep -q "# 全局的打开文件数" "/etc/systemd/system.conf"; then
		LOG_TEMP_LOG=" ● 系统配置 已调优(适配 RedHat系列linux),跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
        return
    fi

	# 1 调整systemctl管理的 servie 资源限制
	echo "# 全局的打开文件数" >> /etc/systemd/system.conf
	echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
	echo "# 全局打开进程数" >> /etc/systemd/system.conf
	echo "DefaultLimitNPROC=65535" >> /etc/systemd/system.conf
	
	# 2 调整系统内核参数
	echo "# 全局:端口最大的监听队列的长度,可为:32768" >> /etc/sysctl.conf
	echo "net.core.somaxconn=32768" >> /etc/sysctl.conf
	echo "# 内存分配模式:1为不限制" >> /etc/sysctl.conf
	echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
	echo "# 单进程打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.nr_open = 2097152" >> /etc/sysctl.conf
	echo "# 系统打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.file-max = 102400" >> /etc/sysctl.conf
	
	# 2.1 刷新内核参数,立即生效
	/sbin/sysctl -p
	
	# 3 调整用户组资源限制
	echo "# 用户会话的 打开文件句柄数" >> /etc/security/limits.conf
	echo "* soft nofile 1048576" >> /etc/security/limits.conf
	echo "* hard nofile 1048576" >> /etc/security/limits.conf
	echo "# 用户会话的 打开进程数限制" >> /etc/security/limits.conf
	echo "* soft nproc 65535" >> /etc/security/limits.conf
	echo "* hard nproc 65535" >> /etc/security/limits.conf
	
	LOG_TEMP_LOG=" ● 系统配置 调优完成(适配 RedHat系列linux)"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in
	"push") 
        push 
        ;;
	"remove") 
        remove 
        ;;
    "log") 
        log 
        ;;
    *)
usage 
;; 
esac

6、测试运行一键安装命令

1)将文件上传至另一台机器上,进程测试,并纠正sh脚本;

#授予执行权限
chmod +x soft.sh
#测试安装
sh soft.sh push

2) 成功安装的效果图

 卸载脚本,重新测试

cd /opt/soft
sh soft.sh remove

新的脚本,比之centos7 多了默认开放远程访问数据,安装后可连接测试

附录:

1)测试用的rpm及相关文件:

链接:https://pan.baidu.com/s/1NSB8VqDjNgaj2tzOY9uT6w 
提取码:blib 

2)centos7 自动化 mysql、redis、nginx、jdk、rabbitMq、syslog程序的soft.sh 脚本

centos7 的yum 文件修改 如图

soft.sh 脚本:

注:centos7已经快停止维护了,仅做参考

#!/bin/bash
# 项目部署基础路径
BASE_PATH="/usr/local"

# 压缩包名
TAR_GZ_NAME="centos7-rpm.tar.gz"

# 压缩包和脚本的发布路径
PUSH_SH_PATH="/opt/push"

# 解压路径
UNZIP_TEMP_PATH="/usr/local/soft_unzip"

# 1.1 数据库密码
MYSQL_PWD="123456"
# 1.2 自动创建数据库名称
MYSQL_CREATE_DB_NAME="test_db"

# 2 安装到的JavaPath路径
JAVA_HOME_PATH="/usr/local/jdk17-TencentKona"

# 2 rabbitMq 账号和密码
RABBITMQ_USER="admin"
RABBITMQ_PWD="123456"
#-------------------往下为不建议调整参数--------------------
#参数1:操作类型
operate="$1"
#可选参数2 指定安装的软件
soft="$2"

# 发布压缩包 解压后路径(会在解压后确定)
PUSH_TEMP_PATH=""

# 检测的java_home位置的变量
JAVA_HOME=""

# 中文字体路径
FONT_PATH="/usr/share/fonts/chinese"

# 系统服务所在路径
SYS_SERVICE_PATH="/etc/systemd/system"

# 空数组:存储汇总日志
log_array=()
# 临时日志变量
LOG_TEMP_LOG=""

#使用说明,用来提示输入参数
usage() {
    echo "脚本可选通用命令:"
	echo " ● 安装 1) sh soft.sh push 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog|all],无第二个参数,安装所有-需确认,all:安装所有-无需确认;"
	echo " ● 卸载 2)sh soft.sh remove 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog],无第二个参数:卸载所有;"
	echo " ● 日志 3)sh soft.sh log 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog],无第二个参数:查看所有;"
	
	echo " ● -- 参数 2 概述:"
	echo " ●      1、font:中文字体,2、jdk :java运行依赖,及jdk-17-TencentKona;"
	echo " ●      3、mysql:mysql-8.0.36,4、nginx:nginx-1.24.0,5、redis:redis-7.2.4"
	echo " ●      6、rabbitmq:rabbitmq-3.11.28,7、syslog:syslog-8.24.0"
    exit 1
}

#建立相关文件夹并注册自启动服务
push(){
	#解压tar包
	un_tar_gz
	
	# 如果未指定安装软件
	if [ -z "${soft}" ]; then
		# 1、安装 中文字体
		while true; do
			# 1 提示用户输入(y or n)
			read -p "1、do you want to install chinese font?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				font_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:1、chinese font "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 2、安装 jdk
		while true; do
			# 1 提示用户输入(y or n)
			read -p "2、do you want to install jdk17_TencentKona?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				jdk17_TencentKona_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:2、jdk17_TencentKona "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 3、安装 mysql
		while true; do
			# 1 提示用户输入(y or n)
			read -p "3、do you want to install mysql-8.0.36 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				mysql_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:3、mysql-8.0.36 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 4、安装 nginx
		while true; do
			# 1 提示用户输入(y or n)
			read -p "4、do you want to install nginx-1.24.0 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				nginx_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:4、nginx-1.24.0 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 5、安装 redis
		while true; do
			# 1 提示用户输入(y or n)
			read -p "5、do you want to install redis-7.2.4 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				redis_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:5、redis-7.2.4 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 6、安装 rabbitmq
		while true; do
			# 1 提示用户输入(y or n)
			read -p "6、do you want to install rabbitmq-3.11.28 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				rabbitmq_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:6、rabbitmq-3.11.28 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 7、安装 syslog
		while true; do
			# 1 提示用户输入(y or n)
			read -p "7、do you want to install rsyslog-8.24.0 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				syslog_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:7、rsyslog-8.24.0 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
	else
		case "$soft" in
			"font")
				font_install
				;;
			"jdk")
			   jdk17_TencentKona_install
				;;
			"mysql")
				mysql_install
				;;
			"nginx")
				nginx_install
				;;
			"redis")
				redis_install
				;;
			"rabbitmq")
				rabbitmq_install
				;;
			"syslog")
				syslog_install
				;;
			"all")
			    #1、安装 中文字体
				font_install
				# 2、安装 jdk
				jdk17_TencentKona_install
				# 3、安装 mysql
				mysql_install
				# 4、安装 nginx
				nginx_install
				# 5、安装 redis
				redis_install
				# 6、安装 rabbitmq
				rabbitmq_install
				# 7、安装 syslog
				syslog_install
				;;
		esac
	fi
	
	#删除解压的文件
	rm -rf $UNZIP_TEMP_PATH
	# 开放防火墙
	firewall_port_open
	# 调优系统配置
	sys_com_tuning
	
	# 8、打印汇总日志
	if [ -z "${soft}" ] ||[ "${soft}" = "all" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: end of install exe;"
}

# 卸载服务结束
remove(){
	# 关闭防火墙(应用不在时,有警告,需在最前面)
	firewall_port_close
	
	# 1、中文字体
	if [ -z "${soft}" ] || [ "${soft}" = "font" ]; then
		font_remove
	fi
	
	# 2、安装jdk
	if [ -z "${soft}" ] || [ "${soft}" = "jdk" ]; then
		jdk17_TencentKona_remove
	fi
	
	# 3、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_remove
	fi
	
	# 4、安装 nginx
	if [ -z "${soft}" ] || [ "${soft}" = "nginx" ]; then
		nginx_remove
	fi
	
	# 5、安装 redis
	if [ -z "${soft}" ] || [ "${soft}" = "redis" ]; then
		redis_remove
	fi
	
	# 6、安装 rabbitmq
	if [ -z "${soft}" ] || [ "${soft}" = "rabbitmq" ]; then
		rabbitmq_remove
	fi
	
	# 7、安装 syslog
	if [ -z "${soft}" ] || [ "${soft}" = "syslog" ]; then
		syslog_remove
	fi
	
	# 8、打印汇总日志
	if [ -z "${soft}" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: 卸载命令执行结束;"
}

#日志
log(){
    # 1、中文字体
	if [ -z "${soft}" ] || [ "${soft}" = "font" ]; then
		font_log
	fi
	
	# 2、安装jdk
	if [ -z "${soft}" ] || [ "${soft}" = "jdk" ]; then
		jdk17_TencentKona_log
	fi
	
	# 3、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_log
	fi
	
	# 4、安装 nginx
	if [ -z "${soft}" ] || [ "${soft}" = "nginx" ]; then
		nginx_log
	fi
	
	# 5、安装 redis
	if [ -z "${soft}" ] || [ "${soft}" = "redis" ]; then
		redis_log
	fi
	
	# 6、安装 rabbitmq
	if [ -z "${soft}" ] || [ "${soft}" = "rabbitmq" ]; then
		rabbitmq_log
	fi
	
	# 7、安装 syslog
	if [ -z "${soft}" ] || [ "${soft}" = "syslog" ]; then
		syslog_log
	fi
	
	# 8、 打印汇总日志
	if [ -z "${soft}" ]; then
		pirnt_sum_log
	fi
}

#安装中文字体
font_install(){
	# 1 如果安装的字体软件都存在,则不安装
	font_state=`rpm -qa | grep font-config`
	font_cache_state=`rpm -qa | grep ttmkfdir`
	if [ -n "${font_state}" ] && [ -n "${font_cache_state}" ]; then
		return
	fi
	
	# 2 安装字体
	cd $PUSH_TEMP_PATH/font/base
	yum -y localinstall *.rpm
	
	# 3 将字体考到指定文件夹
	rm -rf $FONT_PATH
	mkdir -p $FONT_PATH
	cp -rf $PUSH_TEMP_PATH/font/chinese-font/* $FONT_PATH
	chmod -R 755 $FONT_PATH
	
	# 4 汇总生成fonts.scale文件
	ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
	
	# 5 替换字体配置
    cat $PUSH_TEMP_PATH/font/conf/fonts.conf > /etc/fonts/fonts.conf
	
	# 刷新内存中的字体缓存
	fc-cache
	
	echo " ● end install: chinese font;"
	#打印日志
	font_log
}

#删除安装的中文字体
font_remove(){
	#卸载字体软件
	yum remove -y fontconfig
	yum remove -y ttmkfdir
	
	#删除上传的中文字体
	rm -rf $FONT_PATH
	
	#打印日志
	font_log
	echo " ● end remove: chinese font;"
}

# 刷新字体配置(手工添加字体,可以执行下列命令)
font_reload(){
	# 刷新内存中的字体缓存
	fc-cache
	# 查看字体安装情况
	font_log
}

# 查看 中文字体 安装情况
font_log(){
	#检查 中文字体 是否安装成功
	font_log_status=`fc-list | grep chinese`
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作不是卸载,且检索 中文字体 存在,打印成功,否则打印失败
		if [ -n "${font_log_status}" ]; then
			LOG_TEMP_LOG=" ● success:install chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
			
			echo " ${font_log_status}"
		else
			LOG_TEMP_LOG=" ● error:install chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		# 2.1 如果操作是卸载,且检索 中文字体 不存在,打印成功,否则打印失败
		if [ -z "${font_log_status}" ]; then
			LOG_TEMP_LOG=" ● success:remove chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
			
			echo " ${font_log_status}"
		fi
	fi
}

#chrony :分布式保持时间一致性
chrony_install(){
	#启动开机自启
	systemctl start chronyd
	systemctl enable chronyd
	
	#设置时区位上海
	timedatectl set-timezone Asia/Shanghai
	
	#强制时间同步
	chronyc -a makestep
	
	echo " ● chronyd: 设置上海时区并自启 end;"
	chrony_log
}

#chrony :查看日志
chrony_log(){
	
	#检查字体是否安装成功
	chrony_log_status=`chronyc sources –v`
	if [ -n "${chrony_log_status}" ]; then
		
		LOG_TEMP_LOG=" ● sucdess:install chrony , use Time synchronizer;"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
	else
		LOG_TEMP_LOG=" ● error:install chrony , use Time synchronizer;"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
	fi
}

# jdk17_TencentKona 及运行环境安装
jdk17_TencentKona_install(){
	#1、安装分布式时间同步器
	chrony_install
	
	#2、安装相关依赖 netstat、lsof、unzip、zip、dos2unix、nohup
	cd $PUSH_TEMP_PATH/jdk-17-TencentKona/depend-rpm
	yum -y localinstall *.rpm
	
	# 3 获取JAVA_HOME
	get_java_home
	# 3.1 如果JAVA_HOME 不为空,则退出
	if [ -n "${JAVA_HOME}" ]; then
		return
	fi
	
	JDK_TAR_GZ_NAME="TencentKona-17.0.9.b1-jdk_linux-x86_64.tar.gz"
	#4、安装解压并配置java_home
	cp -rf $PUSH_TEMP_PATH/jdk-17-TencentKona/base/$JDK_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	
	#加压和获取加压后的文件夹
	tar -zxvf $JDK_TAR_GZ_NAME
	JDK_UN_TAR_NAME=$(tar -tzf "$PUSH_TEMP_PATH"/jdk-17-TencentKona/base/"$JDK_TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	# 4.1 重命名解压目录和删除压缩包
	# 一定打开压缩吧确认一下解压后的文件夹
	rm -rf $BASE_PATH/jdk17-TencentKona
	mv $JDK_UN_TAR_NAME jdk17-TencentKona
	rm -rf $BASE_PATH/$JDK_TAR_GZ_NAME

	# echo -e "\n"才能解析成换行符
	echo "# set java environment" >> /etc/profile
	echo "export JAVA_HOME=$JAVA_HOME_PATH" >> /etc/profile
	echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
	echo "export CLASSPATH=.:\$JAVA_HOME/lib" >> /etc/profile
	
	# 5 刷新配置
	source /etc/profile
	sleep 2
	
	echo " ● end install: jdk-TencentKona-17.0.9;"
	
	# 6 显示安装结果
	jdk17_TencentKona_log
}

# jdk17_TencentKona 删除
jdk17_TencentKona_remove(){

	# 1 删除环境变量
	sudo sed -i '/# set java environment/d' /etc/profile
	#用 #替换分隔符/,因为$JAVA_HOME_PATH存在/
	sudo sed -i "\#export JAVA_HOME=$JAVA_HOME_PATH#d" /etc/profile
	sudo sed -i "/export PATH=\$PATH:\$JAVA_HOME\/bin/d" /etc/profile
	sudo sed -i "/export CLASSPATH=.:\$JAVA_HOME\/lib/d" /etc/profile
	
	# 2 刷新配置
	source /etc/profile
	sleep 2
	
	# 3 删除解压后的文件
	rm -rf $JAVA_HOME_PATH
	
	jdk17_TencentKona_log
	echo " ● end remove: jdk-TencentKona-17.0.9;"
}

# jdk17_TencentKona 删除
jdk17_TencentKona_log(){
	# 1 获取JAVA_HOME
	get_java_home
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作不是卸载,且 JAVA_HOME 不为空,打印成功,否则打印失败
		if [ -n "${JAVA_HOME}" ]; then
			
			LOG_TEMP_LOG=" ● success: install jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: install jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		# 2.1 如果操作是卸载,且 JAVA_HOME 为空,打印成功,否则打印失败
		if [ -z "${JAVA_HOME}" ]; then
			LOG_TEMP_LOG=" ● success:remove jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
}

mysql_install(){
	# 1、安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/depend-rpm
	yum -y localinstall *.rpm
	
	# 2.1 添加mysql用户组
	groupadd mysql
	#2.2 用户组添加用户
	useradd -g mysql mysql
	
	# 3 安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/base
	yum -y localinstall *.rpm
	
	# 4 执行初始化并指定密码
	/usr/sbin/mysqld --initialize --user=mysql --lower-case-table-names=1
	
	# 5 备份并修改配置
	rm -rf /etc/my.cnf.bak
	cp -rf /etc/my.cnf /etc/my.cnf.bak
	# 5.1 替换mysql 配置文件
    cat $PUSH_TEMP_PATH/mysql-8.0.36/conf/my.cnf > /etc/my.cnf
	
	# 启动MySQL服务  
	echo "正在启动MySQL服务..."  
	sudo systemctl start mysqld  
	  
	# 等待MySQL服务启动完成   
	sleep 5
	
	# 获取默认密码
	DEFAULT_PASSWORD=$(sudo grep 'A temporary password' /var/log/mysqld.log | awk '{print $NF}')

	# 使用mysqladmin修改密码为12345678
	mysqladmin -u root -p"${DEFAULT_PASSWORD}" password "$MYSQL_PWD"

	# 重启MySQL服务
	sudo systemctl restart mysqld

	# 等待启动完成,导入数据(空库可以启动快)   
	sleep 5
	# 连接到MySQL数据库服务器并创建数据库 
	mysql -u"root" -p"$MYSQL_PWD" -e "CREATE DATABASE ${MYSQL_CREATE_DB_NAME}"
	
	echo " ● end install: mysql-8.0.36;"
	
	# 显示 mysql 状态
	mysql_log
}

mysql_remove(){
	# 1 如果未安装mysql,则退出
	mysqld_install_status=`systemctl list-unit-files | grep mysqld`
	if [ -z "${mysqld_install_status}" ]; then
		return
	fi
	
	# 停止MySQL服务  
	systemctl stop mysqld  
	  
	# 卸载MySQL软件包及其依赖项  
	yum remove -y mysql mysql-server mysql-libs mysql-client-plugins mysql-common
	  
	# 删除MySQL数据目录和配置文件(请谨慎操作)  
	rm -rf /var/lib/mysql 
	rm -rf /etc/my.cnf
	rm -rf /etc/my.cnf.bak
	rm -rf /var/log/mysqld.log
	
	mysql_log
	echo " ● end remove: mysql-8.0.36;"
}

mysql_log(){
	# 1 检测 mysql 是否自启动
	MYSQL_STATUS=$(systemctl is-active mysqld)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 mysql 状态为:活跃的,打印成功,否则打印失败
		if [ "${MYSQL_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 mysql 状态为不存在 或者失败
		if [ "${MYSQL_STATUS}" = "unknown" ] || [ "${MYSQL_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 mysql,或者查看指定查看 mysql 日志,则显示日志
	if [ "${soft}" = "mysql" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/mysqld.log
	fi
}

mysql_imp_sql(){
	SQL_FILE="${PUSH_TEMP_PATH}/mysql-8.0.36/conf/initDb.sql"
	if [ -e "$SQL_FILE" ]; then
		mysql -u"root" -p"12345678" $MYSQL_CREATE_DB_NAME < "$SQL_FILE"
		log_array+=(" ● 执行 mysql 数据数据化。")
		echo " ● 执行 mysql 数据数据化。" 
	else
		log_array+=(" ● 发布包不含 mysql 数据库初始化脚本。")
		echo " ● 发布包不含 mysql 数据库初始化脚本。" 
	fi
}

# nginx 安装
nginx_install(){
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/nginx-1.24.0/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压相关依赖
	NGINX_TAR_GZ_NAME="nginx-1.24.0.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/nginx-1.24.0/base/$NGINX_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	
	# 3.1 解压并获取路径
	tar -zxvf $NGINX_TAR_GZ_NAME
	NGINX_UN_TAR_NAME=$(tar -tzf "$PUSH_TEMP_PATH"/nginx-1.24.0/base/"$NGINX_TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	# 4.1 进入nginx安装路径
	cd $BASE_PATH/$NGINX_UN_TAR_NAME
	
	# 4.2 配置nginx
	./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
	
	# 4.3 执行安装
	make install
	
	# 5 准备使用的 www 用户
	groupadd -f www
	useradd -g www www
	
	cd $BASE_PATH
	# 6 替换nginx 配置
	cat $PUSH_TEMP_PATH/nginx-1.24.0/conf/nginx.conf > /usr/local/nginx/conf/nginx.conf
	
	# 7 注册nginx 服务
	rm -rf $SYS_SERVICE_PATH/nginx.service
	cp -rf $PUSH_TEMP_PATH/nginx-1.24.0/service/nginx.service $SYS_SERVICE_PATH/
	
	# 8.1 设置开机自启动
	#刷新服务配置
	systemctl daemon-reload
	
	# 8.2 开机自启
	systemctl enable nginx.service
	
	# 8.3 启动nginx
	systemctl start nginx.service
	
	# 6.1 删除复制后的 tar.gz 包
	rm -rf $BASE_PATH/nginx-1.24.0
	rm -rf $BASE_PATH/$NGINX_TAR_GZ_NAME
	
	echo " ● end install: nginx-1.24.0;"
	
	# 6.2 等待几秒检测 nginx 状态
	sleep 2
	nginx_log
}

# nginx 删除
nginx_remove(){
	# 1.1 停止服务
    systemctl stop nginx.service
	
	# 1.2 关闭开机自启动
	systemctl disable nginx.service

	echo "  ▶ 已关停相关服务... "
    #停顿 2s 后
    /bin/sleep 2

	# 删除所有的发布文件
	rm -rf $BASE_PATH/nginx

    # 删除发布的自启服务脚本
	rm -rf $SYS_SERVICE_PATH/nginx.service
	#刷新服务配置
	systemctl daemon-reload
	
	nginx_log
	echo " ● end remove: nginx-1.24.0;"
}

# 检测 nginx 日志
nginx_log(){
	# 1 检测 nginx 是否自启动
	NGINX_STATUS=$(systemctl is-active nginx)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 nginx 状态为:活跃的,打印成功,否则打印失败
		if [ "${NGINX_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 nginx 状态为不存在 或者失败
		if [ "${NGINX_STATUS}" = "unknown" ] || [ "${NGINX_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 nginx,或者查看指定查看 nginx 日志,则显示日志
	if [ "${soft}" = "nginx" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 $BASE_PATH/nginx/logs/error.log
	fi
}

# redis 安装
redis_install(){
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/redis-7.2.4/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压相关依赖
	REDIS_TAR_GZ_NAME="redis-7.2.4.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/redis-7.2.4/base/$REDIS_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	tar -zxvf $REDIS_TAR_GZ_NAME
	
	# 4.1 重命名解压目录和删除压缩包
	mv redis-7.2.4 redis
	cd $BASE_PATH/redis
	
	# 4.2 编译和安装
	make && make PREFIX=$BASE_PATH/redis/ install
	
	# 6 替换nginx 配置
	cat $PUSH_TEMP_PATH/redis-7.2.4/conf/redis.conf > /usr/local/redis/redis.conf
	
	rm -rf $SYS_SERVICE_PATH/redis.service
	cp -rf $PUSH_TEMP_PATH/redis-7.2.4/service/redis.service $SYS_SERVICE_PATH/
	
	# 5.1 设置开机自启动
	#刷新服务配置
	systemctl daemon-reload
	
	# 5.3 开机自启
	systemctl enable redis.service
	
	# 5.3 启动 redis
	systemctl start redis.service
	
	# 6.1 删除复制后的 tar.gz 包
	rm -rf $BASE_PATH/$REDIS_TAR_GZ_NAME
	
	echo " ● end install: redis-7.2.4;"
	
	# 6.2 等待几秒检测redis状态
	sleep 2
	redis_log
}

# redis 删除
redis_remove(){
	# 1.1 停止服务
    systemctl stop redis.service
	
	# 1.2 关闭开机自启动
	systemctl disable redis.service

	echo "  ▶ 已关停相关服务... "
    #停顿 2s 后
    /bin/sleep 2

	# 删除所有的发布文件
	rm -rf $BASE_PATH/redis

    # 删除发布的自启服务脚本
	rm -rf $SYS_SERVICE_PATH/redis.service
	#刷新服务配置
	systemctl daemon-reload
	
	redis_log
	echo " ● end remove: redis-7.2.4;"
}

# 检测redis 日志
redis_log(){
	#1.1 检测 redis 是否自启动
	REDIS_STATUS=$(systemctl is-active redis)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 redis 状态为:活跃的,打印成功,否则打印失败
		if [ "${REDIS_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 redis 状态为不存在 或者失败
		if [ "${REDIS_STATUS}" = "unknown" ] || [ "${REDIS_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 redis,或者查看指定查看 redis 日志,则显示日志
	if [ "${soft}" = "redis" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 $BASE_PATH/redis/redis.log
	fi
}

# rabbitmq 安装
rabbitmq_install(){
	
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/rabbitmq-3.11.28/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压erlang
	ERLANG_TAR_GZ_NAME="otp_src_25.3.2.8.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/rabbitmq-3.11.28/base/$ERLANG_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	tar -zxvf $ERLANG_TAR_GZ_NAME
	
	# 4.1 进入erlang 安装包
	cd $BASE_PATH/otp_src_25.3.2.8
	
	# 4.2 配置
	./configure  --prefix=/usr/local/erlang --without-javac
	
	# 4.2 编译和安装
	make && make install
	
	# 5 写入系统配置
	echo "export ERLANG_HOME=/usr/local/erlang " >> /etc/profile
	echo "export PATH=\$ERLANG_HOME/bin:\$PATH" >> /etc/profile
	
	# 刷新配置
	source /etc/profile
	
	# 5 强制安装rabbitmq rpm
	rpm -ivh --nodeps $PUSH_TEMP_PATH/rabbitmq-3.11.28/base/rabbitmq-server-3.11.28-1.el8.noarch.rpm
	
	# 6 替换rebbit 配置文件
    cat $PUSH_TEMP_PATH/rabbitmq-3.11.28/sh/rabbitmq-server > /usr/lib/rabbitmq/bin/rabbitmq-server
	
	# 5.1 强制修改hostname
	hostname localhost.localdomain
	#启动服务
	systemctl start rabbitmq-server
	
	# 5.3 开机自启
	chkconfig rabbitmq-server on
	
	echo " ● end install: rabbitmq-3.11.28;"
	# 6.2 等待几秒查看日志
	sleep 5
	rabbitmq_log
	
	# 6 开启web 管理端
	rabbitmq-plugins enable rabbitmq_management
	
	# 6. 初始化账号密码
	# 6.1 创建账号
	rabbitmqctl add_user "${RABBITMQ_USER}" "${RABBITMQ_PWD}"
	# 6.2 设置用户角色
	rabbitmqctl set_user_tags "${RABBITMQ_USER}" administrator
	#6.4 设置用户权限
	# set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
	rabbitmqctl set_permissions -p "/" "${RABBITMQ_USER}" ".*" ".*" ".*"
	#7 用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
	##查看当前用户和角色
	rabbitmqctl list_users
}

# rabbitmq 删除
rabbitmq_remove(){

	# 1 关闭服务
	chkconfig rabbitmq-server off
	
	# 2 停止服务
	systemctl stop rabbitmq-server
	
	# 6.2 等待几秒查看
	sleep 5
	
	# 7.1 卸载程序
	rpm -e rabbitmq-server-3.11.28-1.el8.noarch
	
	# 7.2 删除环境变量
	sudo sed -i "/export ERLANG_HOME=\/usr\/local\/erlang/d" /etc/profile
	sudo sed -i "/export PATH=\$ERLANG_HOME\/bin:\$PATH/d" /etc/profile
	
	# 3 删除erlang
	rm -rf /usr/local/erlang
	
	rabbitmq_log
	echo " ● end remove: rabbitmq-3.11.28;"
}

# 检测redis 日志
rabbitmq_log(){
	#1.1 检测 rabbitmq 是否自启动
	RABBITMQ_STATUS=$(systemctl is-active rabbitmq-server)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 rabbitmq 状态为:活跃的,打印成功,否则打印失败
		if [ "${RABBITMQ_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 rabbitmq 状态为不存在 或者失败
		if [ "${RABBITMQ_STATUS}" = "unknown" ] || [ "${RABBITMQ_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 rabbitmq,或者查看指定查看 rabbitmq 日志,则显示日志
	if [ "${soft}" = "rabbitmq" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		# tail -f -n 20 /var/log/rabbitmq/rabbit@*.log
		tail -f -n 20 /var/log/rabbitmq/rabbit@$(hostname).log
	fi
}

# syslog 安装
syslog_install(){
	
	# 1 安装 syslog
	yum -y localinstall $PUSH_TEMP_PATH/syslog-8.24.0/base/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm
	
	# 2 替换syslog 配置
	cat $PUSH_TEMP_PATH/syslog-8.24.0/conf/rsyslog.conf > /etc/rsyslog.conf
	
	# 4.1 刷新服务
	systemctl daemon-reload
	# 4.2 重新启动
	systemctl restart rsyslog
	# 4.3 开机自启
	systemctl enable rsyslog
	
	echo " ● end install: syslog-8.24.0;"
	
	# 5 等待几秒检测 syslog 状态
	sleep 2
	syslog_log
}

# syslog 删除
syslog_remove(){

	# 1 关闭开机自启动
	systemctl disable rsyslog

	# 2 停止服务
	systemctl stop rsyslog
	
	# 3 卸载程序
	rpm -e rsyslog-8.24.0-57.el7_9.3.x86_64
	
	sleep 2
	
	syslog_log
	echo " ● end remove: rsyslog-8.24.0;"
}

# 检测 syslog 日志
syslog_log(){
	#1.1 检测 syslog 是否自启动
	SYSLOG_STATUS=$(systemctl is-active rsyslog)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 syslog 状态为:活跃的,打印成功,否则打印失败
		if [ "${SYSLOG_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 syslog 状态为不存在 或者失败
		if [ "${SYSLOG_STATUS}" = "unknown" ] || [ "${SYSLOG_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 syslog,或者查看指定查看 syslog 日志,则显示日志
	if [ "${soft}" = "syslog" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/messages
	fi
}

#解压tar包
un_tar_gz(){
	#1 删除可能存在的解压不全的临时文件
	rm -rf $UNZIP_TEMP_PATH
	
	#2 创建加压的文件夹
	mkdir -p $UNZIP_TEMP_PATH

	#2 进行解压操作
	tar -zxvf $PUSH_SH_PATH/$TAR_GZ_NAME -C $UNZIP_TEMP_PATH 
	
	#3 获取加压后的文件路径
	#UNZIP_DIR_NAME=$(echo "$UNZIP_TEMP_PATH"/* | awk '{print $1}' | xargs basename)
	UNZIP_DIR_NAME=$(tar -tzf "$PUSH_SH_PATH"/"$TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	#4 获取到解压后的真实路径
	PUSH_TEMP_PATH=$UNZIP_TEMP_PATH/$UNZIP_DIR_NAME
}

# 获取JAVA_HOME
get_java_home(){
    # 1、如果JAVA_HOME 不为空,则退出
	if [ -n "${JAVA_HOME}" ]; then
		return
	fi
	
	#2、通过java程序查找(如果是子shell 可能读不到)
	JAVA_PATH=$(which java)
	if [ -n "${JAVA_PATH}" ]; then
		# 获取java的上2级作为JAVA_HOME
		JAVA_HOME=$(dirname "$(dirname "$JAVA_PATH")")
	else
		#3、读取不到,则读取配置文件
		JAVA_HOME=$(grep -m 1 'JAVA_HOME=' /etc/profile | awk -F= '{print $2}' | tr -d ' ')
	fi
}

#打印中途记录的在log_array内的内容
pirnt_sum_log(){
	# 打印数组的每个元素
	echo "-----------------------summary-log-start------------------------------"
	for element in "${log_array[@]}"; do
		echo "$element"
	done
	echo "-----------------------summary-log-end ------------------------------"
}

#防火墙开放端口
firewall_port_open(){

	# 定义要检查的端口号
	PORT=88
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi

	echo "调整 firewall 防火墙:"
	firewall-cmd --zone=public --add-port=88/tcp --permanent
	firewall-cmd --zone=public --add-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙关闭端口
firewall_port_close(){
	echo "调整 firewall 防火墙:"
	
	firewall-cmd --zone=public --remove-port=88/tcp --permanent
	firewall-cmd --zone=public --remove-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙日志
firewall_port_log(){
	open_ports=$(firewall-cmd --list-ports)
	LOG_TEMP_LOG=" ● firewall-cmd open port:${open_ports}"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

# 系统调优(RedHat系列linux)
sys_com_tuning(){
	
	# 搜索文件中是否包含指定文本
   if grep -q "# 全局的打开文件数" "/etc/systemd/system.conf"; then
		LOG_TEMP_LOG=" ● 系统配置 已调优(适配 RedHat系列linux),跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
        return
    fi

	# 1 调整systemctl管理的 servie 资源限制
	echo "# 全局的打开文件数" >> /etc/systemd/system.conf
	echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
	echo "# 全局打开进程数" >> /etc/systemd/system.conf
	echo "DefaultLimitNPROC=65535" >> /etc/systemd/system.conf
	
	# 2 调整系统内核参数
	echo "# 全局:端口最大的监听队列的长度,可为:32768" >> /etc/sysctl.conf
	echo "net.core.somaxconn=32768" >> /etc/sysctl.conf
	echo "# 内存分配模式:1为不限制" >> /etc/sysctl.conf
	echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
	echo "# 单进程打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.nr_open = 2097152" >> /etc/sysctl.conf
	echo "# 系统打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.file-max = 102400" >> /etc/sysctl.conf
	
	# 2.1 刷新内核参数,立即生效
	/sbin/sysctl -p
	
	# 3 调整用户组资源限制
	echo "# 用户会话的 打开文件句柄数" >> /etc/security/limits.conf
	echo "* soft nofile 1048576" >> /etc/security/limits.conf
	echo "* hard nofile 1048576" >> /etc/security/limits.conf
	echo "# 用户会话的 打开进程数限制" >> /etc/security/limits.conf
	echo "* soft nproc 65535" >> /etc/security/limits.conf
	echo "* hard nproc 65535" >> /etc/security/limits.conf
	
	LOG_TEMP_LOG=" ● 系统配置 调优完成(适配 RedHat系列linux)"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in
	"push") 
        push 
        ;;
	"remove") 
        remove 
        ;;
    "log") 
        log 
        ;;
    *)
usage 
;; 
esac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效使用git流程分享

准备 假设你已经 clone 了当前仓库&#xff0c;并且你的终端位置已经位于仓库目录中。 查询状态 查询状态常用的命令有 git status 和 git branch。 前者用于查询更改文件情况&#xff0c;后者用于展示所有分支。 chatbot-system$ git status On branch develop Your bran…

RedisCluster集群中的插槽为什么是16384个?

RedisCluster集群中的插槽为什么是16384个&#xff1f; CRC16的算法原理。 1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位&#xff0c;若该位为0左移一位&#xff0c;若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5…

PHP姓名快速匿名化工具(重组脱敏)

PHP姓名重组工具(脱敏/匿名化工具) 将excel数据姓名列粘贴提交&#xff0c;得到随机姓随机中间字随机尾字的重组姓名 那些年自用瞎搞的代码&#xff0c;今日整理成网页交提交得到结果的交互功能分享。 <?php //PHP姓名重组工具(脱敏/匿名化工具) //将excel数据姓名列粘贴…

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

Obsidian使用200+插件与70+种主题分享

主题资源 下载方式一&#xff1a; 网盘下载 密码:a3eu 下载方式二&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fOgP8lY29sYxkUAbTlQQCw 提取码&#xff1a;qhxa 下载解压打开红色框文件夹 上面的是插件&#xff0c;下面的是主题 以下介绍安装主题 打开Obsidi…

定义一个符号常量,并计算

这段代码的输出结果是什么 #include <stdio.h> #define PI 32 int main() { int iPI*2; printf("i%d\n",i);} 是7。 我问了一下AI&#xff0c;AI也回答错了&#xff0c;这是个值得注意的地方。

华为鸿蒙生态杀疯了 大厂高薪急聘鸿蒙开发者

前言 最近有接收到个别小伙伴的疑惑&#xff0c;说鸿蒙现在前景不好就业又困难&#xff0c;为什么我偏偏选择了他呢&#xff1f; 但其实真正了解鸿蒙前景的小伙伴都知道&#xff0c;鸿蒙系统强势来袭&#xff0c;华为“纯血鸿蒙”技术开发人员急缺&#xff0c;薪资待遇极好&a…

云原生(四)、Docker-Compose

Docker-Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个简单的 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;从而使得在不同环境中轻松部署应用程序变得更加简单和可靠。 Docker Compose 主要由以下几个核心组件组成&#xf…

DockerHub搜索并拉取一个Redis镜像

1&#xff09;去DockerHub搜索Redis镜像 2&#xff09;查看Redis镜像的名称和版本 3&#xff09;利用docker pull命令拉取镜像 4&#xff09;利用docker save命令将 redis:latest打包为一个redis.tar包 5&#xff09;利用docker rmi 删除本地的redis:latest 6&#xff09;利用…

小鹏MONA将至:10 - 15万级,用性价比打新势力,用智驾打比亚迪

‍ 作者 |老缅 编辑 |德新 小鹏的全新品牌即将发布&#xff0c;10-15万级也能有高等级智能驾驶。 3月16日在中国电动汽车百人会论坛2024上&#xff0c;小鹏汽车董事长、CEO何小鹏提出&#xff1a;“下一个十年将是智能化的十年。未来18个月内高阶智驾的拐点将到来”。 所谓…

Git——GitHub远端协作详解

目录 Git&GitHub1、将内容Push到GitHub上1.1、在GitHub上创建新项目1.2、upstream1.3、如果不想要相同的分支名称 2、Pull下载更新2.1、Fetch指令2.2、Fetch原理2.3、Pull指令2.4、PullRebase 3、为什么有时候推不上去3.1、问题复现3.2、解决方案一&#xff1a;先拉再推3.3…

深度学习神经网络相关记录《二》

如何判断模型是一个好模型&#xff1f; 模型预测效果&#xff0c;也就是模型预测的准确率运算速度&#xff1b;能够处理大量数据、短时间内急速学习、可以实时进行预测&#xff0c;是机器学习的重要优势&#xff1b;可解释性&#xff1b;深度学习已经不太关系这一点了&#xf…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

苍穹外卖-day09:用户端历史订单模块(理解业务逻辑),商家端订单管理模块(理解业务逻辑),校验收货地址是否超出配送范围(相关API)

用户端历史订单模块 1. 查询历史订单&#xff08;分页查询&#xff09; 1.1 需求分析和设计 产品原型&#xff1a; 业务规则 分页查询历史订单可以根据订单状态查询展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接&#xff1a;“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…

202303 CSP认证 | LDAP

LDAP 好好好&#xff0c;难度直线上升&#xff0c;是一道又有了字符串处理味道的第三题 第一把写官网40分&#xff0c;acwing TLE且只通过了一道数据…本文是自己这题奋斗过程 的一个记录 先贴个40分的代码&#xff1a; #include<bits/stdc.h> using namespace std; t…

2024全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开 定制版红娘交友平台小程序源码&#xff0c;很牛逼的东西&#xff0c;虽然是小程序&#xff0c;但是有700多M大&…

LeetCode每日一题【59.螺旋矩阵Ⅱ】

思路&#xff1a;模拟&#xff0c;给出上下左右4个方向的边界&#xff0c;逐步收缩 class Solution { public:vector<vector<int>> generateMatrix(int n) {int left 0;int right n-1;int top 0;int bottom n-1;int k 1;vector<vector<int>> ans…

七、链表问题(中)

2、两数相加&#xff08;中等&#xff09; 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以…

window 查看特定端口占用并停掉

要查看Windows上特定端口的占用情况并停止相关进程&#xff0c;你可以使用以下步骤&#xff1a; 查看端口占用&#xff1a; 首先&#xff0c;你可以使用netstat命令来查看特定端口的占用情况。假设你想要查看端口号为8080的情况&#xff0c;你可以运行以下命令&#xff1a; net…