Linux服务异常停止无法自动重启,脚本问题排查求助
修复Linux服务自动重启脚本的问题
你的脚本无法自动重启服务,主要有几个关键问题,我给你逐一修正:
原脚本的核心问题
- PID检测逻辑错误:
ps aux | grep service会把执行grep的自身进程也列出来,导致服务明明停了,pid1却不为空,直接跳过重启逻辑。 - systemctl启动方式错误:用
nohup systemctl start ...完全没必要,systemctl是系统服务管理工具,不需要后台启动,反而可能导致权限或执行异常。 - 邮件发送语法错误:
/bin/mail ... < "Service is not running"会把这个字符串当作文件名去读取,根本发不出正确内容的邮件。 - 未定义变量:
SUBJECT1没初始化,发送重启成功邮件时会报错。
修改后的完整脚本
#!/bin/bash SUBJECT="Service Alarm" SUBJECT1="Service Restart Success" TOEMAIL="myemail@example.com" SERVICE_NAME="your-service-name" # 替换成你实际的服务名 # 正确检测服务进程:过滤掉grep自身,精准匹配服务 pid1=$(ps aux | grep "$SERVICE_NAME" | grep -v grep | awk '{print $2}') if [ -z "$pid1" ]; then echo "Service is Not Running." # 正确发送告警邮件:用echo管道传递内容 echo "Service $SERVICE_NAME is not running, attempting restart." | /bin/mail -s "$SUBJECT" "$TOEMAIL" # 直接用systemctl启动服务(必须root权限执行) systemctl start "$SERVICE_NAME" sleep 10 # 缩短等待时间,10秒足够多数服务启动 # 再次检测服务状态 pid2=$(ps aux | grep "$SERVICE_NAME" | grep -v grep | awk '{print $2}') echo "$pid2" if [ ! -z "$pid2" ]; then echo "Service is running." echo "Service $SERVICE_NAME has been restarted successfully. PID: $pid2" | /bin/mail -s "$SUBJECT1" "$TOEMAIL" else echo "Failed to restart service!" echo "Attempt to restart service $SERVICE_NAME failed." | /bin/mail -s "$SUBJECT - Restart Failed" "$TOEMAIL" fi else echo "Service is running. PID: $pid1" fi
额外注意事项
- 权限要求:脚本必须以root用户执行,否则systemctl没有权限管理服务,可通过
chmod +x script.sh赋予执行权限,再添加到root的crontab定时运行(比如每分钟一次)。 - 服务名替换:把
SERVICE_NAME改成你实际的服务名称(比如nginx、redis),避免模糊匹配导致误判。 - 更可靠的检测方式:推荐用
systemctl is-active --quiet $SERVICE_NAME替代PID检测,逻辑更精准:if ! systemctl is-active --quiet "$SERVICE_NAME"; then # 服务未运行,执行重启逻辑 fi
内容的提问来源于stack exchange,提问作者Birkan Herdinç
相关产品推荐
相关产品推荐

