Linux常用软件安装脚本
一、引言
在Linux系统中,安装常用软件是日常运维和系统管理工作的重要部分。通过编写一个脚本,我们可以自动化地完成这些软件的安装过程,提高工作效率。本文将详细介绍一个Linux常用软件安装脚本的编写过程,包括脚本的设计思路、表格列出所需安装的软件、具体的脚本代码、代码运行流程图等。
二、脚本设计思路
-
需求分析:
- 确定需要安装的软件及其版本。
- 确定软件的安装路径和配置文件路径。
- 确定脚本的运行环境(如Linux发行版)。
-
脚本结构:
- 脚本头部:包含脚本说明、版本信息、作者信息等。
- 变量定义:定义安装路径、安装包名称等变量。
- 函数定义:定义安装、卸载、启动、停止等功能的函数。
- 主菜单:提供用户选择安装、卸载、启动、停止等操作的界面。
- 脚本入口点:调用主菜单函数。
-
权限检查:
- 确保脚本以root权限运行,因为安装软件通常需要写入系统目录。
-
错误处理:
- 在关键步骤添加错误检查,如检查安装包是否存在、安装目录是否存在等。
- 提供用户友好的错误信息。
-
日志记录:
- 将安装过程中的关键信息记录到日志文件中,以便后续排查问题。
三、所需安装的软件及版本
以下是需要安装的常用软件及其版本的表格:
| 序号 | 软件名称 | 版本号 | 安装路径 |
|---|---|---|---|
| 1 | JDK | jdk1.8.0_291 | /usr/local/java |
| 2 | Nginx | 1.21.6 | /usr/local/nginx |
| 3 | Redis | 7.0.5 | /usr/local/redis |
| 4 | 达梦 | 最新 | /usr/local/dangmeng |
| 5 | 人大金仓 | 最新 | /usr/local/kingbase |
四、脚本代码
以下是详细的脚本代码,包括JDK、Nginx、Redis、达梦 和人大金仓的安装过程:
#!/bin/bash
# 定义 JDK 安装目录变量
JDK_INSTALL_DIR="/usr/local/java"
# 定义 JDK 安装包文件名变量
JDK_TARBALL="jdk1.8.0_291.tar.gz"
# 安装 JDK
function installJava() {
echo "开始安装 JDK..."
# 判断 $JDK_INSTALL_DIR 目录是否存在,不存在则创建
if [ ! -d "$JDK_INSTALL_DIR" ]; then
echo "创建目录 $JDK_INSTALL_DIR..."
mkdir -p "$JDK_INSTALL_DIR"
fi
# 判断JDK安装包是否在当前目录
if [ ! -f "$JDK_TARBALL" ]; then
echo "JDK 安装包 $JDK_TARBALL 不存在,请确保路径正确"
return 1
fi
# 拷贝JDK安装包到 $JDK_INSTALL_DIR 目录
cp "$JDK_TARBALL" "$JDK_INSTALL_DIR"
# 切换到 $JDK_INSTALL_DIR 目录
cd "$JDK_INSTALL_DIR"
# 解压JDK安装包
tar -zxvf "$JDK_TARBALL"
# 获取解压后的JDK目录名
JDK_DIR=$(ls -d jdk* | head -1)
# 编辑 /etc/profile 文件
echo "export JAVA_HOME=$JDK_INSTALL_DIR/$JDK_DIR" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile
# 使 /etc/profile 中的新环境变量立即生效
source /etc/profile
# 输出 Java 版本以验证安装
echo "JDK 安装完成。"
java -version
}
# 卸载 JDK
function uninstallJava() {
echo "开始卸载 JDK..."
# 从 /etc/profile 中移除 JAVA_HOME
sed -i "/JAVA_HOME/d" /etc/profile
sed -i "s|:$JDK_INSTALL_DIR/jdk*/bin||" /etc/profile
echo "export PATH=$PATH" >> /etc/profile
# 删除 JDK 目录
if [ -d "$JDK_INSTALL_DIR/jdk*" ]; then
rm -rf "$JDK_INSTALL_DIR/jdk*"
else
echo "JDK 目录不存在,卸载终止。"
return 1
fi
# 使更改生效
source /etc/profile
echo "JDK 卸载完成。"
}
# 主菜单函数
function mainMenu() {
echo "请选择一个选项:"
echo "1) 安装 JDK1"
echo "2) 卸载 JDK"
read -p "输入你的选择(1-2):" choice
case $choice in
1)
installJava
;;
2)
uninstallJava
;;
*)
echo "无效的选项,请输入 1 或 2。"
;;
esac
}
# 脚本入口点
mainMenu
# Redis安装目录变量
REDIS_INSTALL_DIR="/usr/local/redis"
# Redis安装包文件名变量
REDIS_TARBALL="redis-7.0.5.tar.gz"
# Redis下载URL(可选)
REDIS_URL="https://example.com/download/$REDIS_TARBALL"
# 安装Nginx
install_nginx() {
# 安装依赖库
yum install -y $NGINX_DEPS
check_dir_exists $NGINX_INSTALL_DIR
download_package $NGINX_URL $NGINX_TARBALL
tar -zxvf $NGINX_TARBALL -C /usr/local/src
cd /usr/local/src/nginx-$NGINX_VERSION
./configure --prefix=$NGINX_INSTALL_DIR --with-http_ssl_module --with-stream --with-mail --with-pcre --with-zlib=../zlib-$ZLIB_VERSION --with-openssl=../openssl-$OPENSSL_VERSION
make
make install
echo "$(date): Nginx 安装完成。" | tee -a $LOG_FILE
}
#!/bin/bash
# 定义Redis安装目录变量
REDIS_INSTALL_DIR="/usr/local/redis"
# 定义Redis压缩包文件名变量
REDIS_TARBALL="redis-7.0.5.tar.gz"
# 定义Redis解压后的目录名变量
REDIS_DIR_NAME="redis-7.0.5"
# 函数:检查目录是否存在
check_dir_exists() {
if [ ! -d "$1" ]; then
echo "目录 $1 不存在。"
echo "请创建该目录后再尝试安装。"
return 1 # 返回一个错误码表示目录不存在
fi
}
# 函数:安装Redis
install_redis() {
# 检查安装目录是否存在
check_dir_exists "$REDIS_INSTALL_DIR"
if [ $? -ne 0 ]; then
return 1
fi
# 如果一切检查通过,继续安装过程
echo "开始安装Redis..."
# 进入解压后的Redis目录
cd "$REDIS_DIR_NAME"
# 解压Redis安装包
tar -xzvf "$REDIS_TARBALL"
# 编译并安装Redis到$REDIS_INSTALL_DIR目录
make PREFIX="$REDIS_INSTALL_DIR" install
# 将Redis的配置文件复制到$REDIS_INSTALL_DIR/bin目录下
cp redis.conf "$REDIS_INSTALL_DIR"/bin/
# 切换到$REDIS_INSTALL_DIR/bin目录
cd "$REDIS_INSTALL_DIR"/bin
# 后台启动Redis服务
# ./redis-server "$REDIS_INSTALL_DIR"/bin/redis.conf &
echo "Redis安装完成。"
}
# 定义函数:启动Redis
start_redis() {
echo "启动Redis服务..."
"$REDIS_INSTALL_DIR"/bin/redis-server /usr/local/redis/bin/redis.conf
}
# 定义函数:后台启动Redis
background_start_redis() {
echo "后台启动Redis服务..."
"$REDIS_INSTALL_DIR"/bin/redis-server /usr/local/redis/bin/redis.conf &
echo "Redis服务已在后台启动。"
}
# 定义函数:停止Redis
stop_redis() {
ps -ef |grep redis
pkill -x "redis-server"
echo "停止所有Redis服务..."
ps -ef |grep redis
}
# 定义函数:卸载Redis
uninstall_redis() {
# 检查Redis服务是否正在运行
if pgrep -x "redis-server" > /dev/null; then
echo "Redis服务正在运行。"
echo "请先关闭Redis服务再进行卸载。"
return 1
else
echo "Redis服务未运行,可以进行卸载。"
fi
echo "删除Redis可执行文件..."
rm -rf "$REDIS_INSTALL_DIR"/bin
echo "删除Redis文件..."
rm -rf "$REDIS_INSTALL_DIR/$REDIS_DIR_NAME"
# 删除pid文件
echo "删除pid文件..."
rm -rf /var/run/redis_*.pid
echo "Redis已卸载。"
}
# 主菜单函数
show_menu() {
echo "请选择操作:"
echo "1) 安装Redis"
echo "2) 启动Redis"
echo "3) 后台启动Redis"
echo "4) 停止Redis"
echo "5) 卸载Redis"
echo "6) 退出"
read -p "输入选项1:" option
case $option in
1) install_redis ;;
2) start_redis ;;
3) background_start_redis ;;
4) stop_redis ;;
5) uninstall_redis ;;
6) exit ;;
*) echo "无效选项。" ;;
esac
}
# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "该脚本必须以root权限运行" 1>&2
exit 1
fi
# 显示主菜单
while true; do
show_menu
done
#!/bin/bash
:
# 查看文档 https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html
:
# 函数:创建达梦数据库用户和用户组
save_user(){
echo "1、创建达梦安装用户和用户组..."
# 检查用户组是否存在,不存在则创建
if ! grep -q "^dinstall:" /etc/group; then
groupadd -g 12349 dinstall
echo "用户组 dinstall 创建成功。"
else
echo "用户组 dinstall 已存在。"
fi
# 检查用户是否存在,不存在则创建
if ! id -u dmdba &>/dev/null; then
useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo "用户 dmdba 创建成功。"
else
echo "用户 dmdba 已存在。"
fi
echo "创建达梦安装用户和用户组完成"
}
# 函数:设置文件句柄限制
set_nofile_limit() {
echo "2、添加limits.conf配置..."
# 定义limits.conf文件的路径
limits_conf="/etc/security/limits.conf"
# 检查软限制是否已经设置
if ! grep -q "* soft nofile 65536" "$limits_conf"; then
echo "* soft nofile 65536" >> "$limits_conf"
fi
# 检查硬限制是否已经设置
if ! grep -q "* hard nofile 65536" "$limits_conf"; then
echo "* hard nofile 65536" >> "$limits_conf"
fi
echo "添加limits.conf配置完成"
}
# 定义达梦数据库的安装目录变量
# 函数:创建达梦数据库目录并设置所有权
mkdir_dameng_directories() {
dameng_install_dir="/usr/local/dameng"
echo "4、达梦数据库目录创建..."
# 创建达梦数据库的根目录,如果不存在
if [ ! -d "$dameng_install_dir" ]; then
mkdir -p "$dameng_install_dir"
echo "创建目录 $dameng_install_dir"
else
echo "目录 $dameng_install_dir 已存在"
fi
# 更改目录所有权为dmdba用户
chown dmdba "$dameng_install_dir"
echo "更改目录 $dameng_install_dir 的所有权为 dmdba 用户"
# 定义子目录列表
local sub_dirs=("dmdbms" "dmdata" "dmdata/data")
# 切换到dmdba用户并为每个子目录执行操作
for dir in "${sub_dirs[@]}"; do
local full_dir="$dameng_install_dir/$dir"
if [ ! -d "$full_dir" ]; then
su dmdba -c "mkdir -p '$full_dir'"
echo "为 dmdba 用户创建目录 $full_dir"
else
echo "目录 $full_dir 已存在"
fi
done
echo "达梦数据库目录创建完成"
}
# ISO文件路径
ISO_PATH="/opt/dm/dm8_20240712_x86_rh7_64.iso"
# 挂载点路径
MOUNT_POINT="/opt/dm/dm"
# 函数:挂载ISO文件
mount_iso() {
echo "3、挂载开始..."
# 挂载ISO文件
mount -o loop "$ISO_PATH" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "ISO文件已成功挂载到 $MOUNT_POINT"
else
echo "错误:挂载ISO文件失败"
return 1
fi
echo "3、挂载成功..."
}
# 函数:安装Dm前准备步骤
saveDmEnv() {
save_user
set_nofile_limit
# 挂载
mount_iso
mkdir_dameng_directories
echo "请切换到dmdba "+",到" "$ISO_PATH" "$MOUNT_POINT" "执行./DMInstall.bin -i"
}
# 主菜单函数
show_menu() {
echo "请选择操作:"
echo "1) 安装Dm环境"
echo "2) 退出"
read -p "输入选项" option
case $option in
1) saveDmEnv ;;
2) exit ;;
*) echo "无效选项。" ;;
esac
}
# 安装 ./DMInstall.bin -i
# 初始化数据库示例
# 新版本取消LENGTH_IN_CHAR=1
# ./dminit PATH=/usr/local/dameng/dmdata/data PAGE_SIZE=32 CASE_SENSITIVE=0 CHARSET=1 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER PORT_NUM=5236 新版本
# ./dminit PATH=/usr/local/dameng/dmdata/data PAGE_SIZE=32 CASE_SENSITIVE=0 CHARSET=1 LENGTH_IN_CHAR=1 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER PORT_NUM=5236 旧版本
# 创建数据库服务
# su root
# cd /usr/local/dameng/dmdbms/script/root
# ./dm_service_installer.sh -t dmserver -p DMSERVER1 -dm_ini /usr/local/dameng/dmdata/data/DAMENG/dm.ini
# 启动 systemctl start DmServiceDMSERVER
# 查看状态 systemctl status DmServiceDMSERVER
# 停止 systemctl stop DmServiceDMSERVER
#卸载
#1:关闭数据库服务(DmServiceDMSERVER实例服务)
#例:安装目录bin下执行:./DmServiceDMSERVER stop
#2:删除数据库实例(如果数据放在安装目录的data下,删除data目录就可以)
#例:rm -rf data
#3:卸载数据库软件
#例:使用root执行:./uninstall.sh -i
# 显示主菜单
while true; do
show_menu
done
#!/bin/bash
:
# 查看文档 https://help.kingbase.com.cn/v8/install-updata/install-linux/install-linux-2.html
:
# 函数:创建人大金仓据库用户
save_user(){
echo "1、创建人大金仓据库用户..."
# 用户名和密码
username="kingbase"
password="kingbase"
# 检查用户名是否已经存在
if id "$username" &>/dev/null; then
echo "用户 $username 已存在。"
else
# 创建用户
sudo useradd -m "$username"
echo "用户 $username 创建成功。"
# 设置密码
echo "$username:$password" | sudo chpasswd
echo "密码已设置为 $password。"
fi
echo "创建人大金仓据库用户完成"
}
# 函数:新建安装目录
#!/bin/bash
mkdir_dir() {
echo "2、创建人大金金仓安装目录..."
# 定义安装目录的父目录
parent_dir="/usr/local/kingbaseES"
# 检查父目录是否存在,如果不存在则创建
if [ ! -d "$parent_dir" ]; then
echo "父目录 $parent_dir 不存在,正在创建..."
mkdir -p "$parent_dir"
if [ $? -eq 0 ]; then
echo "父目录 $parent_dir 创建成功。"
else
echo "父目录 $parent_dir 创建失败,请检查权限。"
return 1
fi
else
echo "父目录 $parent_dir 已存在。"
fi
# 定义具体的安装目录
install_dir="$parent_dir/kingbsse"
data_dir="$parent_dir/data"
# 检查安装目录是否存在,如果不存在则创建
if [ ! -d "$install_dir" ]; then
echo "安装目录 $install_dir 不存在,正在创建..."
mkdir -p "$install_dir"
if [ $? -eq 0 ]; then
echo "安装目录 $install_dir 创建成功。"
else
echo "安装目录 $install_dir 创建失败,请检查权限。"
return 1
fi
else
echo "安装目录 $install_dir 已存在。"
fi
# 检查数据目录是否存在,如果不存在则创建
if [ ! -d "$data_dir" ]; then
echo "数据目录 $data_dir 不存在,正在创建..."
mkdir -p "$data_dir"
if [ $? -eq 0 ]; then
echo "数据目录 $data_dir 创建成功。"
else
echo "数据目录 $data_dir 创建失败,请检查权限。"
return 1
fi
else
echo "数据目录 $data_dir 已存在。"
fi
# 改变目录所有者为kingbase用户
chown -R kingbase:kingbase "$parent_dir"
# 赋予kingbase用户读写执行权限
chmod -R 755 "$parent_dir"
echo "创建人大金金仓安装目录完成"
}
# ISO文件路径
ISO_PATH="/opt/kingbase/KingbaseES_V009R001C001B0030_Lin64_install.iso"
# 挂载点路径
MOUNT_POINT="/opt/kingbase/kingbase"
# 函数:挂载ISO文件
mount_iso() {
echo "3、挂载开始..."
# 挂载ISO文件
mount -o loop "$ISO_PATH" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "ISO文件已成功挂载到 $MOUNT_POINT"
else
echo "错误:挂载ISO文件失败"
return 1
fi
echo "3、挂载成功..."
}
# 函数:安装Dm前准备步骤
saveDmEnv() {
save_user
mkdir_dir
# 挂载
mount_iso
echo "人大金仓安装前准备就绪,请参照https://help.kingbase.com.cn/v8/install-updata/install-linux/install-linux-3.html 安装,注意:请切换到kingbase用户执行后续操作"
}
#启动服务
#sys_ctl -w start -D ${/usr/local/kingbaseES/data} -l "${/usr/local/kingbaseES/data}/sys_log/startup.log"
#停止服务
#sys_ctl stop -m fast -w -D ${Data文件目录}
# 主菜单函数
show_menu() {
echo "请选择操作:"
echo "1) 安装人大金仓环境"
echo "2) 退出"
read -p "输入选项" option
case $option in
1) saveDmEnv ;;
2) exit ;;
*) echo "无效选项。" ;;
esac
}
# 显示主菜单
while true; do
show_menu
done