Linux服务控制脚本用case语句匹配$1参数实现start/stop/restart/status分支,以esac结尾、;;终止各分支,通配符*兜底;需结合systemd或手动PID管理真实控制逻辑,并添加root校验、重复启动防护及依赖检查。

Linux 中用 case 语句写服务控制脚本,核心是把启动(start)、停止(stop)、重启(restart)、状态(status)等操作映射到不同分支,结构清晰、易读易维护。
基础语法结构要写对
case 语句依赖位置参数(通常是 $1)匹配预定义的模式。必须以 esac 结尾,每个分支用 ;; 终止。通配符 * 作为兜底处理非法参数。
基本骨架如下:
#!/bin/bash
case $1 in
start)
echo "启动服务..."
# 实际启动命令,如 systemctl start xxx 或 ./app &
;;
stop)
echo "停止服务..."
# 实际停止命令,如 systemctl stop xxx 或 kill $(cat pidfile)
;;
restart)
$0 stop
$0 start
;;
status)
echo "检查服务状态..."
# 如 ps aux | grep app 或 systemctl is-active xxx
;;
*)
echo "用法:$0 {start|stop|restart|status}"
exit 1
;;
esac
结合真实服务逻辑更可靠
纯 echo 不算真正控制服务。需根据服务类型选择合适方式:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 若服务已由 systemd 管理(推荐),直接调用
systemctl:systemctl start myapp.service、systemctl is-active --quiet myapp.service && echo "running" - 若为自研后台程序,需手动管理进程和 PID 文件:
启动时用nohup ./myserver > /dev/null 2>&1 & echo $! > /var/run/myserver.pid;
停止时用kill $(cat /var/run/myserver.pid) 2>/dev/null || true,再清理 PID 文件 - 状态检查建议用
pgrep或pidof避免误判:if pgrep -f "myserver" > /dev/null; then echo "running"; else echo "stopped"; fi
加权限、放路径、测试运行
脚本写完不能直接执行,需三步落地:
- 赋予可执行权限:
chmod +x /usr/local/bin/myappctl - 建议放在系统 PATH 下(如
/usr/local/bin),方便全局调用 - 测试各分支:
./myappctl start→./myappctl status→./myappctl stop,确认无报错且行为符合预期
增强健壮性的小技巧
生产环境脚本最好加上简单防护:
- 检查是否以 root 运行(多数服务需特权):
[[ $EUID -ne 0 ]] && { echo "请用 root 运行"; exit 1; } - 启动前判断是否已运行,避免重复启动:
pgrep -f "myserver" && { echo "服务已在运行"; exit 1; } - 停止后等待几秒再检查状态,防止进程未完全退出就被判定失败
- 所有外部命令(如 systemctl、pgrep)加
command -v xxx > /dev/null || { echo "缺少依赖"; exit 1; }做前置校验










