当前位置: 首页 > news >正文

脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)

文章目录

  • 前言
  • 一、什么是脚本化安装
  • 二、使用步骤
    • 1.物理磁盘脚本挂载(离线)
    • 2.yum脚本化安装(离线)
    • 3.nfs脚本化安装(离线)
    • 4.pg数据库脚本化安装(离线)
    • 5.nginx脚本化安装(离线)
  • 总结


前言

在Linux中,Shell脚本是一种强大的工具,用于自动化任务和管理系统。编写Shell脚本时,需要遵循一定的格式和规范,以确保脚本的可读性和可维护性。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是脚本化安装

Linux脚本是一种可以在Linux或其他类Unix操作系统上运行的脚本语言。它可以用于自动化系统管理任务、软件开发、数据处理等各种任务。脚本通常是以文本文件的形式编写,其中包含一系列命令和语句,这些命令和语句可以在终端或脚本解释器中执行。

底层原理是,当用户运行脚本时,操作系统会将其交给解释器解释执行。解释器会逐行读取脚本文件,将每一行转化为对应的操作系统命令进行执行。因为Linux脚本语言是一种解释型语言,所以它可以在不同的平台和系统上运行,而不需要进行编译。这使得脚本编写和调试更加容易。

脚本语言的优点是它具有易读性、易维护性、易于使用的特点。Linux脚本可以处理多种文本格式,包括CSV、XML、JSON等。此外,它还具有强大的系统管理功能,如文件管理、进程管理、网络管理等。因此,它在自动化运维、软件开发、数据处理等领域广泛应用。

二、使用步骤

1.物理磁盘脚本挂载(离线)

使用方法
将代码保存为.sh格式

dos2unix 物理盘挂载.sh     ----转载为linux可识别的语言
sh 物理盘挂载.sh           ----根据提示填写信息即可

代码

#!/bin/bash# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; thenecho "请以root用户或使用sudo运行此脚本"exit 1
fi# 列出所有块设备
echo "当前块设备列表:"
lsblk# 提示用户输入设备路径
read -p "请输入要格式化的磁盘设备路径(例如 /dev/vdb):" DEVICE_PATH# 检查设备是否存在
if [ ! -e "$DEVICE_PATH" ]; thenecho "设备 $DEVICE_PATH 不存在,请检查路径是否正确!"exit 1
fi# 提示用户确认设备路径
echo "您选择的设备是:$DEVICE_PATH"
read -p "请确认是否继续格式化此设备?(y/n): " CONFIRMif [ "$CONFIRM" != "y" ]; thenecho "操作已取消。"exit 0
fi# 提示用户选择文件系统类型
echo "请选择要使用的文件系统类型:"
echo "1. ext3"
echo "2. ext4"
echo "3. xfs"
echo "4. btrfs"
read -p "输入选项(1-4):" FILESYSTEM_OPTION# 根据用户选择设置文件系统类型
case $FILESYSTEM_OPTION in1) FILESYSTEM="ext3";;2) FILESYSTEM="ext4";;3) FILESYSTEM="xfs";;4) FILESYSTEM="btrfs";;*) echo "无效选项,默认使用 ext3"; FILESYSTEM="ext3";;
esac# 格式化磁盘
echo "格式化 $DEVICE_PATH 为 $FILESYSTEM 文件系统..."
if [ "$FILESYSTEM" == "xfs" ]; thenmkfs.xfs "$DEVICE_PATH"
elif [ "$FILESYSTEM" == "btrfs" ]; thenmkfs.btrfs "$DEVICE_PATH"
elsemkfs.$FILESYSTEM "$DEVICE_PATH"
fi# 提示用户输入挂载点路径
read -p "请输入挂载点路径(例如 /vdb):" MOUNT_POINT# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"# 挂载设备到挂载点
echo "挂载 $DEVICE_PATH 到 $MOUNT_POINT..."
mount "$DEVICE_PATH" "$MOUNT_POINT"# 编辑 /etc/fstab 文件,以确保系统重启后自动挂载
echo "编辑 /etc/fstab 文件以确保系统重启后自动挂载..."
echo "$DEVICE_PATH $MOUNT_POINT $FILESYSTEM defaults 0 0" >> /etc/fstab# 检查挂载是否成功
echo "检查挂载是否成功..."
mount -a# 列出所有块设备,确认挂载
echo "当前块设备列表:"
lsblk# 重启系统
echo "系统将在5秒后重启..."
sleep 5
reboot

在这里插入图片描述

2.yum脚本化安装(离线)

使用方法和上面差不多

dos2unix yum.sh
sh yum.sh
#!/bin/bash# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; thenecho "请以root用户或使用sudo运行此脚本"exit 1
fi# 提示用户输入挂载点路径(默认为 /media/cdrom)
read -p "请输入挂载点路径(默认为 /media/cdrom):" MOUNT_POINT# 如果用户未输入挂载点路径,则使用默认值
if [ -z "$MOUNT_POINT" ]; thenMOUNT_POINT="/media/cdrom"
fi# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"# 显示磁盘使用情况
echo "当前磁盘使用情况:"
df -h# 备份原有yum仓库配置
echo "备份原有yum仓库配置..."
cp -rf /etc/yum.repos.d /etc/yum.repos.d_bak# 清除原有yum仓库配置
echo "清除原有yum仓库配置..."
rm -rf /etc/yum.repos.d/*# 创建新的yum仓库配置文件
echo "创建新的yum仓库配置文件..."
cat <<EOF > /etc/yum.repos.d/Media.repo
[iso]
name=Media
baseurl=file://${MOUNT_POINT}/
gpgcheck=0
enabled=1
EOF# 编辑fstab文件以自动挂载光驱
echo "编辑 /etc/fstab 文件以自动挂载光驱..."
echo "/dev/sr0   ${MOUNT_POINT}   iso9660   defaults   0   0" >> /etc/fstab# 重新加载systemd配置
echo "重新加载systemd配置..."
systemctl daemon-reload# 挂载所有文件系统
echo "挂载所有文件系统..."
mount -a# 停止并禁用防火墙
echo "停止并禁用防火墙..."
systemctl stop firewalld
systemctl disable firewalld# 清除yum缓存并重建
echo "清除yum缓存并重建..."
yum clean all
yum makecache# 列出可用的软件包
echo "列出可用的软件包..."
yum list# 确认挂载成功
echo "挂载点 $MOUNT_POINT 的挂载状态:"
mount | grep "$MOUNT_POINT"# 完成提示
echo "配置完成!挂载点已设置为 $MOUNT_POINT,yum仓库已配置。"

在这里插入图片描述

3.nfs脚本化安装(离线)

使用方法

dos2unix nfs.sh
sh nfs.sh

代码

#!/bin/bash# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "$SHARE_DIR" ]; thenSHARE_DIR="/home/nfs"echo "未输入共享目录路径,使用默认值 $SHARE_DIR"
fi# 创建NFS共享目录
echo "创建NFS共享目录 $SHARE_DIR..."
mkdir -p "$SHARE_DIR"
chmod -R 777 "$SHARE_DIR"  # 将权限改为777# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOF
$SHARE_DIR *(rw,sync,no_root_squash)
EOF# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-serverecho "设置nfs服务开机自启动..."
systemctl enable nfs-serverecho "NFS服务器配置完成。"# 提示用户是否在本地安装NFS客户端
read -p "是否在本地安装NFS客户端?(y/n, 默认n): " INSTALL_LOCALif [[ "$INSTALL_LOCAL" == "y" ]]; then# 安装nfs客户端echo "安装nfs客户端..."yum install -y nfs-utilsecho "NFS客户端安装完成。"
fi# 提示用户输入目标服务器的IP地址,支持多个IP地址
read -p "请输入目标服务器的IP地址,多个IP地址用逗号分隔(留空跳过): " TARGET_IPS# 如果用户没有输入目标IP地址,则跳过分发步骤
if [ -z "$TARGET_IPS" ]; thenecho "未输入目标服务器IP地址,跳过分发步骤。"
else# 将逗号分隔的IP地址转换为数组IFS=',' read -r -a TARGET_IP_ARRAY <<< "$TARGET_IPS"# 定义目标服务器的用户名(默认 root)TARGET_USER="root"# 定义目标服务器上的目标路径TARGET_DIR="/root/"# 定义脚本文件名SCRIPT_FILE="setup_nfs.sh"# 将当前脚本内容保存到临时文件echo "将当前脚本保存为临时文件 $SCRIPT_FILE ..."cat > "$SCRIPT_FILE" <<EOF
#!/bin/bash# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "\$SHARE_DIR" ]; thenSHARE_DIR="/home/nfs"echo "未输入共享目录路径,使用默认值 \$SHARE_DIR"
fi# 创建NFS共享目录
echo "创建NFS共享目录 \$SHARE_DIR..."
mkdir -p "\$SHARE_DIR"
chmod -R 777 "\$SHARE_DIR"  # 将权限改为777# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOL
\$SHARE_DIR *(rw,sync,no_root_squash)
EOL# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-serverecho "设置nfs服务开机自启动..."
systemctl enable nfs-serverecho "NFS服务器配置完成。"
EOF# 设置脚本权限chmod +x "$SCRIPT_FILE"# 遍历所有目标服务器,发送并执行脚本for TARGET_IP in "${TARGET_IP_ARRAY[@]}"; doecho "处理目标服务器 $TARGET_IP..."# 确保目标路径存在echo "在目标服务器 $TARGET_IP 上创建目标路径 $TARGET_DIR ..."ssh "$TARGET_USER@$TARGET_IP" "mkdir -p $TARGET_DIR"# 将脚本发送到目标服务器echo "将脚本 $SCRIPT_FILE 发送到目标服务器 $TARGET_IP ..."scp "$SCRIPT_FILE" "$TARGET_USER@$TARGET_IP:$TARGET_DIR"# 在目标服务器上执行脚本echo "在目标服务器 $TARGET_IP 上执行脚本..."ssh "$TARGET_USER@$TARGET_IP" "chmod +x $TARGET_DIR/$SCRIPT_FILE && $TARGET_DIR/$SCRIPT_FILE"done# 删除本地的临时脚本文件echo "删除本地的临时脚本文件 $SCRIPT_FILE ..."rm "$SCRIPT_FILE"echo "NFS配置脚本已成功发送并在所有目标服务器上执行。"
fi

在这里插入图片描述

4.pg数据库脚本化安装(离线)

使用方法

dos2unix pg.sh
sh pg.sh

代码

#!/bin/bashset -e  # 出现错误时退出脚本function setup_logging {log_file="/var/log/pg_install.log"touch "$log_file"exec > >(tee -i "$log_file") 2>&1echo "日志文件:$log_file"
}function install_postgresql {# 引入日志记录setup_logging# 提示用户输入源码包的存放路径echo "请输入 PostgreSQL 源码包的存放路径(例如 /data/sources):"read -r source_path# 在指定路径下查找 .tar.gz 或 .tar 文件source_file=$(find "$source_path" -type f \( -name "*.tar.gz" -o -name "*.tar" \) -print -quit)# 检查是否找到文件if [ -z "$source_file" ]; thenecho "未在路径 $source_path 下找到 .tar.gz 或 .tar 文件。请检查路径并重新运行脚本。"exit 1fi# 解压找到的源码包echo "正在解压 $source_file..."tar -zxvf "$source_file"# 获取解压后的目录名tar_dir=$(tar -tf "$source_file" | head -1 | cut -f1 -d"/")# 进入解压后的目录cd "$tar_dir" || { echo "无法进入目录 $tar_dir。请检查解压结果。"; exit 1; }# 添加 PostgreSQL 用户useradd postgresql# 提示用户是否要手动设置密码echo "是否要手动设置 PostgreSQL 用户的密码? (y/n)"read -r answerif [[ "$answer" == "y" ]]; then# 提示用户手动输入密码passwd postgresqlelse# 使用默认密码 root1234echo "postgresql:root1234" | chpasswdecho "默认密码 root1234 已设置。"fi# 提示用户是否已经手动创建了数据目录echo "是否已经手动创建了 PostgreSQL 数据目录? (y/n)"read -r data_dir_answerif [[ "$data_dir_answer" != "y" ]]; then# 提示用户输入数据目录路径echo "请输入 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"read -r data_dir_path# 创建 PostgreSQL 数据目录mkdir -p "$data_dir_path"chown -R postgresql:postgresql "$data_dir_path"chmod 750 "$data_dir_path"else# 提示用户输入现有的数据目录路径echo "请输入现有的 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"read -r data_dir_pathfi# 提示用户是否已经手动创建了安装路径echo "是否已经手动创建了 PostgreSQL 安装路径(例如 /data/postgresql/pgsql)? (y/n)"read -r install_dir_answerif [[ "$install_dir_answer" != "y" ]]; then# 提示用户输入 PostgreSQL 安装路径echo "请输入 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"read -r install_path# 创建 PostgreSQL 安装路径mkdir -p "$install_path"chown -R postgresql:postgresql "$install_path"chmod 750 "$install_path"else# 提示用户输入现有的安装路径echo "请输入现有的 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"read -r install_pathfi# 更新 yum 缓存yum makecache fast# 定义依赖包列表dependencies=(readline-develsystemtapsystemtap-sdt-develperl-ExtUtils-Embedpampam-devellibxml2libxml2-devellibxsltlibxslt-develpython3-devellibicu-develzlib-devel)# 检查并安装缺失的依赖包for pkg in "${dependencies[@]}"; doif ! rpm -q "$pkg" &> /dev/null; thenecho "未安装依赖包 $pkg,正在安装..."yum install -y "$pkg"fidone# 特殊处理 python2-develif ! rpm -q python2-devel &> /dev/null; thenecho "未找到 python2-devel,尝试安装 python3-devel 替代..."yum install -y python3-develfi# 配置 PostgreSQL 的安装选项./configure --prefix="$install_path" --with-pgport=5432 --with-libraries="$install_path/lib" --with-includes="$install_path/include" --with-perl --with-python --with-openssl --with-pam --with-libxml --with-libxslt# 编译并安装 PostgreSQLmake && make install# 设置安装目录权限chown -R postgresql:postgresql "$install_path"chmod 750 "$install_path"# 初始化数据库su - postgresql -c "$install_path/bin/initdb -D $data_dir_path"# 启动 PostgreSQL 服务su - postgresql -c "$install_path/bin/pg_ctl -D $data_dir_path -l $data_dir_path/logfile start"# 修改环境变量cat <<EOF >> /etc/profile
export PATH=$install_path/bin:\$PATH
export PGHOME=$install_path
export PGDATA=$data_dir_path
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$PGHOME/lib
EOF# 使环境变量生效source /etc/profile# 创建 systemd 服务单元文件cat <<EOF > /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target[Service]
Type=forking
User=postgresql
Group=postgresql
Environment=PGPORT=5432
Environment=PGDATA=$data_dir_path
ExecStart=$install_path/bin/pg_ctl start -D \$PGDATA -l \$PGDATA/logfile
ExecStop=$install_path/bin/pg_ctl stop -D \$PGDATA -m fast
ExecReload=$install_path/bin/pg_ctl reload -D \$PGDATA
TimeoutSec=300[Install]
WantedBy=multi-user.target
EOF# 重新加载 systemd 配置systemctl daemon-reload# 询问用户是否设置开机自启动echo "是否设置 PostgreSQL 为开机自启动? (y/n)"read -r enable_answerif [[ "$enable_answer" == "y" ]]; then# 启用 PostgreSQL 服务systemctl enable postgresqlecho "PostgreSQL 已设置为开机自启动。"elseecho "PostgreSQL 未设置为开机自启动。"fi# 启动 PostgreSQL 服务systemctl start postgresqlecho "PostgreSQL 数据库安装并启动成功。"# 修改 postgresql.conf 文件modify_postgresql_conf "$data_dir_path"# 修改 pg_hba.conf 文件modify_pg_hba_conf "$data_dir_path"
}function modify_postgresql_conf {local data_dir_path=$1# 编辑 postgresql.conf 文件echo "正在修改 $data_dir_path/postgresql.conf 文件..."# 修改第60行 listen_addresses 的值为 '*'sed -i '60s/^#//; 60s/localhost/*/' "$data_dir_path/postgresql.conf"# 修改第64行 port 的值为 5432sed -i '64s/^#//' "$data_dir_path/postgresql.conf"echo "postgresql.conf 文件修改完成。"
}function modify_pg_hba_conf {local data_dir_path=$1# 编辑 pg_hba.conf 文件echo "正在修改 $data_dir_path/pg_hba.conf 文件..."# 在匹配行后添加新的配置行sed -i '/# IPv4 local connections:/ a \
host    all             all             0.0.0.0/0               md5' "$data_dir_path/pg_hba.conf"echo "pg_hba.conf 文件修改完成。"
}# 执行 PostgreSQL 安装
install_postgresql

问题

开机自启可提供选择,如果选择启用可能会报错,或者安装好后会报错,看一下之前创建的数据路径底下的logfile

在这里插入图片描述

5.nginx脚本化安装(离线)

使用方法

dos2unix nginx.sh
sh nginx.sh

代码

#!/bin/bash# 检查并创建目录
check_and_create_dir() {local dir=$1if [ ! -d "$dir" ]; thenread -p "目录 $dir 不存在,是否现在创建?(y/n): " choiceif [ "$choice" = "y" ]; thenmkdir -p "$dir"echo "目录 $dir 已创建"elseecho "跳过创建目录 $dir,这可能导致后续操作失败"exit 1fielseecho "目录 $dir 已存在,跳过创建"fi
}# 检查文件是否存在
check_file() {local file=$1if [ ! -f "$file" ]; thenecho "文件 $file 不存在,请下载后再运行此脚本"exit 1fi
}# 解压缩文件到指定目录
unzip_file() {local file=$1local dir=$2check_file "$file"unzip -o "$file" -d "$dir"echo "文件 $file 已解压缩到 $dir"
}# 解压 .tar.gz 文件到指定目录
untar_file() {local file=$1local dir=$2check_file "$file"tar -xvf "$file" -C "$dir"echo "文件 $file 已解压到 $dir"
}# 检查 RPM 包是否已安装,如果未安装且 RPM 文件存在,则安装
check_and_install_rpm() {local rpm_file=$1local package_name=$2if rpm -q "$package_name" > /dev/null; thenecho "包 $package_name 已安装,跳过"elseif [ -f "$rpm_file" ]; thenrpm -ivh "$rpm_file" --nodepsecho "RPM 包 $rpm_file 已安装"elseecho "RPM 包 $rpm_file 不存在,尝试使用 yum 安装"yum install -y "$package_name"if [ $? -ne 0 ]; thenecho "yum 安装 $package_name 失败,请手动安装"exit 1fififi
}# 获取用户指定的解压目录路径,默认为 /data/nginxzip
read -p "请输入文件解压目录(默认为 /data/nginxzip): " dir
dir=${dir:-/data/nginxzip}# 获取 nginx.zip 的具体路径,默认为 /data/nginx.zip
read -p "请指定 nginx.zip 的完整路径(例如:/data/nginx.zip): " nginx_zip_path
nginx_zip_path=${nginx_zip_path:-/data/nginx.zip}# 提示用户创建目录
echo "请确保以下目录已创建在您的系统中,否则脚本将自动为您创建它们:"
echo "$dir"# 暂停以允许用户手工创建目录
read -p "按 Enter 键继续或者退出脚本后手工创建... " -rs
echo# 检查并创建目录
check_and_create_dir "$dir"# 检查文件是否存在
check_file "$nginx_zip_path"# 解压 nginx.zip
unzip_file "$nginx_zip_path" "$dir"# 检查并解压其他文件
files=("nginx-1.20.2.tar.gz" "pcre-8.41.zip" "openssl-1.1.1j.tar.gz" "zlib-1.3.1.tar.gz")
for file in "${files[@]}"; docheck_file "$dir/$file"
doneunzip_file "$dir/pcre-8.41.zip" "$dir"
untar_file "$dir/nginx-1.20.2.tar.gz" "$dir"
untar_file "$dir/openssl-1.1.1j.tar.gz" "$dir"
untar_file "$dir/zlib-1.3.1.tar.gz" "$dir"# 安装所需的 RPM 包
rpms=("cpp-4.8.5-44.el7.x86_64.rpm gcc""gcc-4.8.5-44.el7.x86_64.rpm gcc""gcc-c++-4.8.5-36.el7.x86_64.rpm gcc-c++""glibc-2.17-317.el7.x86_64.rpm glibc""glibc-common-2.17-317.el7.x86_64.rpm glibc-common""glibc-devel-2.17-317.el7.x86_64.rpm glibc-devel""glibc-headers-2.17-317.el7.x86_64.rpm glibc-headers""libstdc++-devel-4.8.5-36.el7.x86_64.rpm libstdc++-devel"
)for rpm in "${rpms[@]}"; dorpm_file=$(echo "$rpm" | cut -d' ' -f1)package_name=$(echo "$rpm" | cut -d' ' -f2)check_and_install_rpm "$rpm_file" "$package_name"
doneecho "所有解压和依赖包安装已完成,开始编译和安装组件..."# 第一步:编译安装 OpenSSL
echo "编译安装 OpenSSL..."
cd "$dir/openssl-1.1.1j/"
./config
if [ $? -eq 0 ]; thenmakeif [ $? -eq 0 ]; thenmake installif [ $? -eq 0 ]; thenecho "OpenSSL 安装成功!"elseecho "OpenSSL make install 失败!"exit 1fielseecho "OpenSSL make 失败!"exit 1fi
elseecho "OpenSSL 配置失败!"exit 1
fi
cd -# 第二步:编译安装 pcre
echo "编译安装 pcre..."
cd "$dir/pcre-8.41/"
./configure
if [ $? -eq 0 ]; thenmakeif [ $? -eq 0 ]; thenmake installif [ $? -eq 0 ]; thenecho "pcre 安装成功!"elseecho "pcre make install 失败!"exit 1fielseecho "pcre make 失败!"exit 1fi
elseecho "pcre 配置失败!"exit 1
fi
cd -# 第三步:编译安装 zlib
echo "编译安装 zlib..."
cd "$dir/zlib-1.3.1/"
./configure
if [ $? -eq 0 ]; thenmakeif [ $? -eq 0 ]; thenmake installif [ $? -eq 0 ]; thenecho "zlib 安装成功!"elseecho "zlib make install 失败!"exit 1fielseecho "zlib make 失败!"exit 1fi
elseecho "zlib 配置失败!"exit 1
fi
cd -# 第四步:编译安装 Nginx
echo "编译安装 Nginx..."
cd "$dir/nginx-1.20.2/"
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.41 --with-openssl=../openssl-1.1.1j --with-stream
if [ $? -eq 0 ]; thenmakeif [ $? -eq 0 ]; thenmake installif [ $? -eq 0 ]; thenecho "Nginx 安装成功!"elseecho "Nginx make install 失败!"exit 1fielseecho "Nginx make 失败!"exit 1fi
elseecho "Nginx 配置失败!"exit 1
fi
cd -# 复制 nginx 到 /usr/bin 目录
if [ -f "/usr/local/nginx/sbin/nginx" ]; thencp /usr/local/nginx/sbin/nginx /usr/bin/if [ $? -eq 0 ]; thenecho "nginx 已成功复制到 /usr/bin 目录"elseecho "复制 nginx 到 /usr/bin 目录失败"exit 1fi
elseecho "/usr/local/nginx/sbin/nginx 文件不存在,请检查 Nginx 是否正确安装"exit 1
fi# 检查 nginx 是否可执行
if [ -x "/usr/bin/nginx" ]; thenecho "nginx 在 /usr/bin 目录下已可用"
elseecho "nginx 在 /usr/bin 目录下不可执行,请检查文件权限"exit 1
fi# 修改 nginx.conf 文件中的端口号
echo "修改 nginx.conf 文件中的端口号..."
sed -i '36s/listen       80;/listen       8088;/' /usr/local/nginx/conf/nginx.conf# 验证修改是否成功
if grep -q "listen       8088;" /usr/local/nginx/conf/nginx.conf; thenecho "nginx.conf 文件中的端口号已成功修改为 8088"
elseecho "nginx.conf 文件中的端口号修改失败,请手动检查文件"exit 1
fi# 定义 Nginx 服务文件内容
nginx_service_content='[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target'# 创建 Nginx 服务文件
echo "创建 Nginx 服务文件 /etc/systemd/system/nginx.service"
echo "$nginx_service_content" | sudo tee /etc/systemd/system/nginx.service > /dev/nullif [ $? -ne 0 ]; thenecho "创建 Nginx 服务文件失败!"exit 1
fi# 重新加载 systemd 配置
echo "重新加载 systemd 配置"
sudo systemctl daemon-reloadif [ $? -ne 0 ]; thenecho "重新加载 systemd 配置失败!"exit 1
fi# 启用 Nginx 服务
echo "启用 Nginx 服务"
sudo systemctl enable nginxif [ $? -ne 0 ]; thenecho "启用 Nginx 服务失败!"exit 1
fi# 启动 Nginx 服务
echo "启动 Nginx 服务"
sudo systemctl start nginxif [ $? -ne 0 ]; thenecho "启动 Nginx 服务失败!"exit 1
fi# 检查 Nginx 服务状态
echo "检查 Nginx 服务状态"
sudo systemctl status nginxif [ $? -ne 0 ]; thenecho "检查 Nginx 服务状态失败!"exit 1
fiecho "所有操作已完成!"

在这里插入图片描述


总结

脚本就是无脑话和不动手安装,本文不存在抄袭,都是自己平时觉得步骤繁琐,根据经验写的,可能有不足大家多多包涵,后续会更新k8s脚本化安装。我已经把脚本上传到资源(脚本.zip)

相关文章:

脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)

文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载&#xff08;离线&#xff09;2.yum脚本化安装&#xff08;离线&#xff09;3.nfs脚本化安装&#xff08;离线&#xff09;4.pg数据库脚本化安装&#xff08;离线&#xff09;5.nginx脚本化安装&#xff08;离…...

// Error: line 1: XGen: Candidate guides have not been associated!

Maya xgen 报错// Error: line 1: XGen: Candidate guides have not been associated! 复制下面粘贴到Maya脚本管理器python运行&#xff1a; import maya.cmds as cmds def connect_xgen_guides():guide_nodes cmds.ls(typexgmMakeGuide)for node in guide_nodes:downstream…...

投机解码论文阅读:Falcon

题目&#xff1a;Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址&#xff1a;https://arxiv.org/pdf/2412.12639 一看它的架构图&#xff0c;可以发现它是基于EAGLE…...

OpenCV实现基于交叉双边滤波的红外可见光融合算法

1 算法原理 CBF是*Cross Bilateral Filter(交叉双边滤波)*的缩写&#xff0c;论文《IMAGE FUSION BASED ON PIXEL SIGNIFICANCE USING CROSS BILATERAL FILTER》。 论文中&#xff0c;作者使用交叉双边滤波算法对原始图像 A A A&#xff0c; B B B 进行处理得到细节&#xff0…...

Springboot整合WebService

1.1 概述 webservice 即 web 服务&#xff0c;因互联网而产生&#xff0c;通过 webservice 这种 web 服务&#xff0c;我们可以实现互联网应 用之间的资源共享&#xff0c;比如我们想知道 手机号码归属地&#xff0c;列车时刻表&#xff0c;天气预报&#xff0c;省市区邮…...

504 Gateway Timeout:网关超时解决方法

一、什么是 504Gateway Timeout&#xff1f; 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种&#xff0c;表示网关或代理服务器在等待上游服务器响应时超时。通俗来说&#xff0c;这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时&#xff1a;反向代…...

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…...

抢十八游戏

前言 我国民国一直流传着一个名叫“抢十八”的抢数游戏&#xff1a;参与游戏的两人从1开始轮流报数&#xff0c;每次至少报1个数&#xff0c;最多报2个数&#xff0c;每人报的每个数不得与自已报过的或对方报过的重复&#xff0c;也不得跳过任何一个数。谁先报到18&#xff0c…...

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…...

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…...

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…...

wordpress 房产网站筛选功能

自定义分类法创建 add_action( init, ashu_post_type ); function ashu_post_type() {register_taxonomy(province,post,array(label => 省,rewrite => array( slug => province ),hierarchical => true));register_taxonomy(city,post,array(label => 市,rewr…...

SQL面试题2:留存率问题

引言 场景介绍&#xff1a; 在互联网产品运营中&#xff0c;用户注册量和留存率是衡量产品吸引力和用户粘性的关键指标&#xff0c;直接影响产品的可持续发展和商业价值。通过分析这些数据&#xff0c;企业可以了解用户行为&#xff0c;优化产品策略&#xff0c;提升用户体验…...

Redis是单线程还是多线程?

大家好&#xff0c;我是锋哥。今天分享关于【Redis是单线程还是多线程&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis是单线程还是多线程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis是 单线程 的。 尽管Redis的处理是单线程的&a…...

mysql 变量,流程控制与游标

第16章_变量,流程控制与游标 1.变量 分为系统变量和用户自定义变量 1.1系统变量 1.1.1系统变量分类 系统变量分为全局系统变量以及会话系统变量 查看所有全局变量 SHOW GLOBAL VARIABLES 查看所有会话变量 SHOW SESSION VARIABLESor SHOW VARIABLES #默认是会话变量 …...

Java配置log4j日志打印

1. 引入依赖 <dependencies><!-- Log4j 2依赖 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>1.2.14</version> <!-- 可以根据需要修改版本 --></…...

什么是SQL?

什么是SQL&#xff1f; SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于与关系型数据库进行交互的标准编程语言。SQL 是设计用于管理和操作关系型数据库的语言&#xff0c;主要用于查询、插入、更新、删除和定义数据结构。SQL 是关…...

Linux 机器学习

Linux 机器学习是指在 Linux 操作系统环境下进行机器学习相关的开发、训练和应用。 具体步骤 环境搭建&#xff1a; 选择合适的 Linux 发行版&#xff1a;如 Ubuntu、Fedora、Arch Linux 等。Ubuntu 因其易用性和丰富的软件包管理系统&#xff0c;适合初学者&#xff1b;Fed…...

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载 效果展示 使用方法 import LoadingText from "../components/LoadingText" import PageToRefresh from "../components/PageToRefresh" import FooterBar from "../components/…...

第27章 汇编语言--- 设备驱动开发基础

汇编语言是低级编程语言的一种&#xff0c;它与特定的计算机架构紧密相关。在设备驱动开发中&#xff0c;汇编语言有时用于编写性能关键的部分或直接操作硬件&#xff0c;因为它是接近机器语言的代码&#xff0c;可以提供对硬件寄存器和指令集的直接访问。 要展开源代码详细叙…...

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…...

【git】-初始git

学习资源推荐- 标签管理 - Git教程 - 廖雪峰的官方网站 一、什么是版本控制&#xff1f; 二、Git的安装 三、掌握Linux常用命令 四、Git基本操作 1、提交代码 2、查看历史提交 3、版本回退 一、什么是版本控制&#xff1f; 版本控制是一种用于记录文件或项目内容变化的系…...

JAVA之单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在软件设计中&#xff0c;单例模式常用于控制对资源的访问&#xff0c;例如数据库连接、线程池等。以下是单例模式的详…...

无人机数据集,支持YOLO,COCO json,PASICAL VOC xml格式的标注,正确识别率可达到95.7%,10000张原始图片

无人机数据集&#xff0c;支持YOLO&#xff0c;COCO json&#xff0c;PASICAL VOC xml格式的标注&#xff0c;正确识别率可达到95.7%&#xff0c;10000张原始图片 下载地址&#xff1a; 标注好的数据集下载地址&#xff1a; yolo v11: https://download.csdn.net/download/p…...

Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)

目录 1. Linux中的进程状态 1.1 前台进程和后台进程 运行状态 睡眠状态 磁盘休眠状态 停止状态 kill指令—向进程发送信号 死亡状态 2. 僵尸进程 2.1 僵尸状态 2.2 僵尸进程 2.3 僵尸进程危害 3. 孤儿进程 4. 进程的优先级 概念 查看进程优先级 PRI&#xff08…...

stack和queue专题

文章目录 stack最小栈题目解析代码 栈的压入弹出序列题目解析代码 queue二叉树的层序遍历题目解析代码 stack stack和queue都是空间适配器 最小栈 最小栈的题目链接 题目解析 minst是空就进栈&#xff0c;或者是val < minst.top()就进栈 代码 class MinStack { public:M…...

一 rk3568 Android 11固件开发环境搭建 (docker)

一 目标 搭建 rk3568 android 系统内核 及固件开发编译调试环境, 支持开发环境导出分享 基于荣品 rk3568 核心板 系统环境: ubuntu22.04 /ubuntu20.04 64位桌面版 编译环境: docker + ubuntu20.04 , 独立的容器隔离环境,不受系统库版本冲突等影响,无性能损耗, 可…...

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读&#xff0c;全文使用中文进行描述&#xff0c;最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作&#xff0c;可自行将自己的结果发给ai&#xff0c…...

三小时深度学习PyTorch

【对新手非常友好】三小时深度学习PyTorch快速入门&#xff01;包教会你的&#xff01; --人工智能/深度学习/pytorch_哔哩哔哩_bilibili从头开始&#xff0c;把概率论、统计、信息论中零散的知识统一起来_哔哩哔哩_bilibili从编解码和词嵌入开始&#xff0c;一步一步理解Trans…...

朴素贝叶斯分类器

一、生成模型&#xff08;学习&#xff09;&#xff08;Generative Model&#xff09; vs 判别模型&#xff08;学习&#xff09;&#xff08;Discriminative Model&#xff09; 结论&#xff1a;贝叶斯分类器是生成模型 1、官方说明 生成模型对联合概率 p(x, y)建模&#x…...

商用车电子电气零部件电磁兼容条件和试验(2)—术语和定义

写在前面 本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求&#xff0c;高压试验项目内容及要求。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 目录 商用车电子电气…...

SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码

导言 如上图所示&#xff0c;进入SimpleFOC官网&#xff0c;点击Github下载源代码。 如上图所示&#xff0c;找到仓库。 comom代码的移植后&#xff0c;simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分&#xff0c;其中communication是跟simpleFOC上位机通讯&a…...

物联网之传感器技术

引言 在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动各行各业变革的重要力量。而物联网传感器&#xff0c;作为物联网感知层的核心技术&#xff0c;更是扮演着不可或缺的角色。它们如同人类的五官&#xff0c;能够感知物理世界中的各种信…...

React:构建用户界面的JavaScript库

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

基于TypeScript封装 `axios` 请求工具详解

TypeScript 项目中&#xff0c;封装一个详细的 axios 请求工具可以提高代码的可维护性、可重用性&#xff0c;并让请求逻辑与业务逻辑分离。以下是一个详细的封装示例&#xff0c;包括请求拦截器、响应拦截器、错误处理、以及类型定义。 1. 安装 Axios 首先&#xff0c;确保你…...

ElasticSearch在Windows环境搭建测试

引子 也持续关注大数据相关内容一段时间&#xff0c;大数据内容很多。想了下还是从目前项目需求侧出发&#xff0c;进行相关学习。Elasticsearch&#xff08;ES&#xff09;是位于 Elastic Stack&#xff08;ELK stack&#xff09; 核心的分布式搜索和分析引擎。Logstash 和 B…...

通信与网络安全管理之ISO七层模型与TCP/IP模型

一.ISO参考模型 OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI&#xff09;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型&#xff0c;为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是…...

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…...

三相无刷电机控制|FOC理论04 - 克拉克变换 + 帕克变换的最终目标

导言 通过坐标系旋转&#xff0c;将电机中复杂的三相交流信号映射到与转子磁场同步的旋转参考系中&#xff0c;将动态问题转化为静态问题。这种方法的优点在于&#xff1a; 简化了控制逻辑。实现了转矩Iq和磁通Id的解耦。提供了直流量控制的可能性&#xff0c;大大提高了控制效…...

SAP FICO资产模块各元素基本关系总结

文章目录 【SAP系统研究】 #SAP #FICO #资产会计 ①&#xff1a;每个折旧表包含多个折旧范围&#xff0c;折旧范围用于设置资产的平行折旧&#xff0c;如不同的折旧范围可以更新不同的总账&#xff0c;更新不同的科目等。 ②&#xff1a;折旧表是要分配给公司代码的&#xff…...

Elasticsearch快速入门

Elasticsearch是由elastic公司开发的一套搜索引擎技术&#xff0c;它是elastic技术栈中的一部分,提供核心的数据存储、搜索、分析功能 elasticsearch之所以有如此高性能的搜索表现&#xff0c;正是得益于底层的倒排索引技术。那么什么是倒排索引呢&#xff1f; Elasticsearch…...

【Java数据结构】二叉树相关算法

第一题&#xff1a;获取二叉树中结点个数 得到二叉树结点个数&#xff0c;如果结点为空则返回0&#xff0c;然后再用递归计算左树结点个数根结点&#xff08;1个&#xff09;右树结点个数。 public int nodeSize(Node root){if (root null)return 0;return nodeSize1(root.l…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…...

vue3学习日记6 - Layout

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...

1/14 C++

练习&#xff1a;将图形类的获取周长和获取面积函数设置成虚函数&#xff0c;完成多态 再定义一个全局函数&#xff0c;能够在该函数中实现&#xff1a;无论传递任何图形&#xff0c;都可以输出传递的图形的周长和面积 #include <iostream>using namespace std; class Sh…...

【Uniapp-Vue3】页面生命周期onLoad和onReady

一、onLoad函数 onLoad在页面载入时触发&#xff0c;多用于页面跳转时进行参数传递。 我们在跳转的时候传递参数name和age: 接受参数&#xff1a; import {onLoad} from "dcloudio/uni-app"; onLoad((e)>{...}) 二、onReady函数 页面生命周期函数中的onReady其…...

使用 configparser 读取 INI 配置文件

使用 configparser 读取 INI 配置文件 适合于读取 .ini 格式的配置文件。 配置文件示例 (config.ini): [DEFAULT] host localhost port 3306 [database] user admin password secret import configparser# 创建配置解析器 config configparser.ConfigParser()# 读取配…...

类模板的使用方法

目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件&#xff1a; 8.类模板与友元 9.类模板案例 MyArray.hpp …...

docker mysql5.7如何设置不区分大小写

环境 docker部署&#xff0c;镜像是5.7&#xff0c;操作系统是centos 操作方式 mysql 配置文件是放在 /etc/mysql/mysql.conf.d/mysqld.cnf&#xff0c; vim /etc/mysql/mysql.conf.d/mysqld.cnf lower_case_table_names1 重启mysql容器 验证 SHOW VARIABLES LIKE low…...

Docker与虚拟机的区别及常用指令详解

在现代软件开发中&#xff0c;容器化和虚拟化技术已经成为不可或缺的工具。Docker和虚拟机&#xff08;VM&#xff09;是两种常见的技术&#xff0c; 它们都可以帮助开发者在不同的环境中运行应用程序。然而&#xff0c;它们的工作原理和使用场景有很大的不同。本文将详细探讨D…...