相比较于《linux centos 脚本批量启动宝塔服务(一)》
改进点说明:
- 使用函数
start_service
统一处理服务启动逻辑,使代码更简洁且易于维护 - 增加了服务状态检查:如果服务已在运行,则跳过启动操作
- 即使某个服务启动失败,脚本会继续执行后续服务的启动
- 增加了计数功能,最后会汇总显示成功和失败的服务数量
- 脚本最终的退出码取决于是否有服务启动失败(0 表示全部成功,1 表示有失败
bash
#!/bin/bash
# 初始化成功和失败计数器
success_count=0
fail_count=0
total_count=0
# 定义启动服务的函数
start_service() {
local service_name=$1
total_count=$((total_count + 1))
echo "------------------------"
echo "处理 $service_name ..."
# 检查服务是否已在运行
if systemctl is-active --quiet "$service_name"; then
echo "$service_name 已在运行中,无需启动"
success_count=$((success_count + 1))
return 0
fi
# 尝试启动服务
if systemctl start "$service_name"; then
echo "$service_name 启动成功"
success_count=$((success_count + 1))
return 0
else
echo "$service_name 启动失败"
fail_count=$((fail_count + 1))
return 1
fi
}
# 按顺序启动各个服务
start_service "nginx"
start_service "redis"
start_service "php-fpm-80"
start_service "mysqld"
start_service "supervisord"
# 显示汇总结果
echo "------------------------"
echo "所有服务处理完成"
echo "总服务数: $total_count"
echo "启动成功: $success_count"
echo "启动失败: $fail_count"
# 根据是否有失败决定最终退出码
if [ $fail_count -eq 0 ]; then
exit 0
else
exit 1
fi
使用方法:
- 将上述代码保存为
start_services.sh
- 赋予执行权限:
chmod +x start_services.sh
- 运行脚本:
./start_services.sh
备注:
- 不同系统上的服务名称可能略有不同(例如 PHP 可能是
php74-fpm
,MySQL 可能是mysqld
或mariadb
),如果启动失败,请检查并修改相应的服务名称 - 可能需要使用
sudo
权限运行:sudo ./start_services.sh
需要查找服务名称使用下面的命令,如:
systemctl list-unit-files | grep -i mysql
nginx可能需要特殊处理,使用下面命令
bash
# Nginx特殊处理:直接检查进程是否存在(避开systemd状态检测问题)
if [ "$service_name" = "nginx" ]; then
# pgrep -x 精确匹配进程名"nginx",存在则返回0(成功)
if pgrep -x "nginx" > /dev/null; then
return 0 # 进程存在,视为运行中
else
return 1 # 进程不存在,视为未运行
fi
fi