!/bin/bashservice_name="$1" [[ -z "$service_name" ]] && { echo "Usage: $0 "; exit 1; } systemctl list-unit-files | grep -q "^$service_name\.service" || { echo "Service '$service_name' not found"; exit 1; } if systemctl is-active --quiet "$service_name"; then echo "Restarting $service_name..." systemctl restart "$service_name" if [[ $? -eq 0 ]]; thensystemctl is-active --quiet "$service_name" && echo "OK" || { echo "Failed"; systemctl status "$service_name" -n20; exit 1; } elseecho "Restart failed"; systemctl status "$service_name" -n20; exit 1 fi else echo "$service_name is not running, starting..." systemctl start "$service_name" systemctl is-active --quiet "$service_name" && echo "OK" || { echo "Start failed"; systemctl status "$service_name" -n20; exit 1; } fi

写一个服务器服务重启脚本,核心是用命令行安全、可靠地停止再启动目标服务,同时兼顾状态检查和错误处理。不建议直接用 kill -9 粗暴终止,优先使用服务管理器(如 systemctl 或 service)的标准接口。
用 systemctl 写标准重启脚本(推荐)
适用于使用 systemd 的现代 Linux 发行版(CentOS 7+/Ubuntu 16.04+)。脚本应判断服务是否存在、是否正在运行,并在重启失败时给出提示。
- 先检查服务名是否有效:
systemctl list-unit-files | grep ^your-service-name.service - 用
systemctl is-active --quiet your-service判断当前状态,避免重复操作 - 用
systemctl restart your-service执行重启,它会自动处理依赖和优雅停止 - 加一句
systemctl is-active --quiet your-service && echo "OK" || echo "Failed"验证结果
兼容旧系统的 service 脚本写法
针对 SysV init 或混合环境(如 CentOS 6、部分 Debian 版本),可用 service 命令替代:
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
-
service your-service status查看当前状态(注意输出格式因服务而异) -
service your-service restart执行重启,多数服务脚本已内置 stop + start 逻辑 - 建议加
sleep 2后再查状态,避免因启动延迟误判失败 - 若服务无标准
restart支持,可拆成service your-service stop && sleep 1 && service your-service start
带日志和简单容错的实用版本
生产环境建议记录操作时间与结果,对关键服务增加重试或退出码判断:
- 开头用
date '+%Y-%m-%d %H:%M:%S'记录时间戳 - 捕获
systemctl restart的退出码:$?为 0 表示成功,非 0 需告警 - 可追加日志到文件,例如:
echo "$(date): restart nginx" >> /var/log/service-restart.log - 重启失败时,用
systemctl status your-service -n20输出最近日志片段,便于快速排查
注意事项和常见坑
别忽略权限、路径和服务依赖这些细节:
- 脚本需以 root 或具有 sudo 权限的用户运行;普通用户执行会报“Access denied”
- 不要硬编码绝对路径(如
/usr/bin/systemctl),除非必要;优先用环境 PATH 中的命令 - 某些服务(如 MySQL、Redis)重启前会做数据校验,耗时较长,脚本里适当加等待或超时控制
- 若服务由 Docker 或 supervisor 管理,不能直接调 systemctl,要改用
docker restart或supervisorctl restart

















