本文目录导读:

- Linux Systemd 服务自动重启(推荐)
- Linux Shell 脚本监控重启
- Python 守护进程自动重启
- Docker 容器自动重启
- Windows 服务自动重启 PowerShell 脚本
- 使用 Supervisord 管理自动重启
- 使用建议
Linux Systemd 服务自动重启(推荐)
创建 systemd 服务单元文件
# /etc/systemd/system/myapp.service [Unit] Description=My Application Service After=network.target [Service] Type=simple User=myuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always RestartSec=10 StartLimitInterval=0 StartLimitBurst=5 [Install] WantedBy=multi-user.target
启用并启动服务
sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service
Linux Shell 脚本监控重启
#!/bin/bash
# 自动重启监控脚本 monitor_restart.sh
SERVICE_NAME="myapp"
SERVICE_CMD="/usr/bin/python3 /opt/myapp/app.py"
LOG_FILE="/var/log/restart_monitor.log"
MAX_RESTARTS=10
RESTART_INTERVAL=60 # 重启间隔(秒)
restart_count=0
while true; do
# 检查服务是否运行
if ! pgrep -f "$SERVICE_NAME" > /dev/null; then
echo "$(date) - $SERVICE_NAME is down. Attempting restart..." >> "$LOG_FILE"
# 检查重启次数限制
if [ $restart_count -ge $MAX_RESTARTS ]; then
echo "$(date) - Max restarts ($MAX_RESTARTS) reached. Not restarting." >> "$LOG_FILE"
break
fi
# 重启服务
$SERVICE_CMD &
PID=$!
echo "$(date) - Service restarted with PID $PID" >> "$LOG_FILE"
((restart_count++))
# 等待一段时间再检查
sleep $RESTART_INTERVAL
fi
sleep 5
done
使用方式
chmod +x monitor_restart.sh nohup ./monitor_restart.sh &
Python 守护进程自动重启
#!/usr/bin/env python3
"""
自动重启服务的 Python 脚本 auto_restart.py
"""
import subprocess
import time
import sys
import os
from datetime import datetime
class ServiceRestarter:
def __init__(self, service_command, service_name=None,
max_restarts=10, restart_delay=10):
self.service_command = service_command
self.service_name = service_name or service_command.split('/')[-1]
self.max_restarts = max_restarts
self.restart_delay = restart_delay
self.restart_count = 0
self.log_file = f"/var/log/{self.service_name}_restart.log"
def log_message(self, message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{timestamp}] {message}"
print(log_entry)
# 写入日志文件
with open(self.log_file, 'a') as f:
f.write(log_entry + "\n")
def is_running(self):
"""检查服务是否在运行"""
try:
result = subprocess.run(
["pgrep", "-f", self.service_name],
capture_output=True,
text=True
)
return result.returncode == 0
except:
return False
def start_service(self):
"""启动服务"""
try:
process = subprocess.Popen(
self.service_command.split(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
self.log_message(f"Service started with PID: {process.pid}")
return process.pid
except Exception as e:
self.log_message(f"Failed to start service: {e}")
return None
def run(self):
"""主循环"""
self.log_message(f"Starting monitor for: {self.service_name}")
while self.restart_count < self.max_restarts:
if not self.is_running():
self.restart_count += 1
self.log_message(
f"Service not running. Attempt {self.restart_count}/{self.max_restarts}"
)
pid = self.start_service()
if pid:
self.log_message(f"Restart successful (PID: {pid})")
# 等待一段时间再检查
time.sleep(self.restart_delay)
else:
self.log_message("Restart failed")
time.sleep(5)
else:
self.log_message("Service is running")
time.sleep(10) # 检查间隔
self.log_message("Maximum restart attempts reached. Exiting.")
if __name__ == "__main__":
# 配置参数
service_cmd = "/usr/bin/python3 /opt/myapp/app.py"
restarter = ServiceRestarter(
service_command=service_cmd,
service_name="myapp",
max_restarts=5,
restart_delay=10
)
restarter.run()
Docker 容器自动重启
使用 Docker Compose 自动重启
# docker-compose.yml
version: '3.8'
services:
myapp:
image: myapp:latest
restart: always
restart_policy:
condition: on-failure
max_attempts: 5
wait: 10s
ports:
- "8080:8080"
environment:
- NODE_ENV=production
使用 Docker Run 命令
docker run -d \ --name myapp \ --restart=always \ --restart-max-attempts=5 \ --restart-window=10s \ myapp:latest
Windows 服务自动重启 PowerShell 脚本
# auto_restart.ps1
$serviceName = "MyAppService"
$maxRestarts = 10
$restartCount = 0
$logFile = "C:\logs\restart_log.txt"
function Write-Log {
param($message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logEntry = "[$timestamp] $message"
Write-Host $logEntry
Add-Content -Path $logFile -Value $logEntry
}
while ($restartCount -lt $maxRestarts) {
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service.Status -ne "Running") {
$restartCount++
Write-Log "Service '$serviceName' is stopped. Restart attempt $restartCount/$maxRestarts"
try {
Start-Service -Name $serviceName
Write-Log "Service '$serviceName' started successfully"
Start-Sleep -Seconds 10 # Wait 10 seconds before next check
}
catch {
Write-Log "Failed to start service: $_"
}
}
else {
Write-Log "Service '$serviceName' is running"
}
Start-Sleep -Seconds 30 # Check every 30 seconds
}
Write-Log "Maximum restart attempts reached. Exiting."
设置定时任务自动执行
# 创建计划任务每小时执行一次
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-File C:\scripts\auto_restart.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "00:00" `
-RepetitionInterval (New-TimeSpan -Hours 1) `
-RepetitionDuration (New-TimeSpan -Days 365)
Register-ScheduledTask -TaskName "ServiceAutoRestart" `
-Action $action -Trigger $trigger -RunLevel Highest
使用 Supervisord 管理自动重启
安装并配置 Supervisord
# 安装 supervisord sudo apt-get install supervisor # 创建配置文件 /etc/supervisor/conf.d/myapp.conf [program:myapp] command=/usr/bin/python3 /opt/myapp/app.py directory=/opt/myapp user=myuser autostart=true autorestart=true startretries=10 exitcodes=0 stopsignal=TERM stopwaitsecs=10 stdout_logfile=/var/log/myapp_stdout.log stderr_logfile=/var/log/myapp_stderr.log
管理 Supervisord 服务
# 更新配置 sudo supervisorctl reread sudo supervisorctl update # 管理服务 sudo supervisorctl start myapp sudo supervisorctl stop myapp sudo supervisorctl restart myapp sudo supervisorctl status myapp
使用建议
-
选择合适方案:
- Linux 服务:优先使用 systemd 或 supervisord
- Docker 环境:使用 Docker 内置重启策略
- Windows 服务:使用 Service 属性或计划任务
-
配置日志记录:记录重启事件和原因,便于故障排查
-
限制重启次数:避免无限重启导致的资源浪费
-
设置合理间隔:至少等待 5-10 秒再尝试重启
-
监控通知:重要服务建议配合监控告警系统
-
测试环境验证:先在测试环境验证重启逻辑
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播