如何编写Shell脚本检测服务运行状态并自动重启及现有脚本报错排查
Shell服务检测重启脚本问题排查与正确实现
报错原因梳理
- 变量赋值语法错误:Shell中变量赋值时等号两侧不能加空格,原脚本
SERVICE = myApp的写法会导致SERVICE变量未被正确赋值,后续grep命令拿到空的匹配模式,触发grep参数格式报错。 - grep匹配误判:
ps -ef | grep -i $SERVICE会匹配到grep自身进程,就算目标服务未运行也会返回成功状态,导致判断逻辑失效。 - 目标程序路径错误:报错提示找不到
/full_path/runMyApp,需要将占位路径替换为你的runMyApp程序的真实绝对路径,同时确认该文件已添加可执行权限。
修正后脚本
#!/bin/sh # 等号两侧无空格,正确赋值服务名 SERVICE="myApp" # 替换为你实际的程序启动绝对路径 APP_PATH="/opt/your_app_dir/runMyApp" # 可选:配置日志路径,记录重启操作和运行日志 LOG_PATH="/var/log/myApp_monitor.log" while true do # 用pgrep匹配进程,-x精确匹配进程名,避免匹配到含同名关键词的其他进程 if ! pgrep -x "$SERVICE" > /dev/null then echo "$(date '+%Y-%m-%d %H:%M:%S') 服务未运行,尝试重启" >> "$LOG_PATH" nohup "$APP_PATH" >> "$LOG_PATH" 2>&1 & fi sleep 10 done
后续操作说明
- 替换脚本中
APP_PATH为你实际的runMyApp程序绝对路径,可在程序所在目录执行readlink -f runMyApp命令获取准确路径 - 给脚本和目标程序添加可执行权限:
chmod +x 你的脚本路径 && chmod +x 你的runMyApp路径 - 优先使用pgrep替代ps+grep组合,逻辑更简洁也避免多余匹配问题
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

