# PM2 崩溃恢复

URL: https://caijiao.org/pm2/auto-restart/crash-recovery
Source: docs/pm2/auto-restart/crash-recovery.md
Description: 了解 PM2 的崩溃恢复机制，掌握如何配置进程崩溃后的自动重启，以保证 Node.js 应用在遇到异常时能够快速恢复，保持高可用性和稳定性。

在生产环境中，应用可能会由于各种原因崩溃或异常退出。为了确保应用在崩溃后能够自动恢复，PM2 提供了崩溃恢复机制。当进程崩溃时，PM2 会自动重启进程，确保应用始终保持在线。

## 1. **自动重启**

PM2 默认启用了自动重启功能。当 Node.js 应用崩溃时，PM2 会自动尝试重新启动该进程。这样可以避免由于进程崩溃导致的服务中断，确保系统的高可用性。

### 示例配置

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      watch: true,        // 启用文件监控
      autorestart: true,  // 启用自动重启
      max_restarts: 10,   // 最大重启次数
      restart_delay: 5000, // 崩溃后 5 秒重启
    },
  ],
};
````

在此配置中，当 `my-app` 应用崩溃时，PM2 会自动重启该应用。`max_restarts` 设置了最大重启次数，超过该次数后应用不会继续重启。`restart_delay` 设置了崩溃后的重启延迟，避免频繁重启带来的系统压力。

## 2. **监控崩溃并重启**

PM2 提供了 `watch` 功能，可以在文件发生变动时自动重启应用。这个功能特别适用于开发环境，但同样适用于生产环境中的崩溃恢复。如果文件系统中的某些关键文件被修改，PM2 会检测到这些变化并自动重启应用。

### 启用文件监控

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      watch: true,  // 启用文件监控
      autorestart: true,  // 启用自动重启
    },
  ],
};
```

### 适用场景

* 适用于开发阶段，监控代码和配置文件变化。
* 适用于生产环境中的故障恢复，尤其是依赖外部文件和配置的应用。

## 3. **进程健康检查**

在某些情况下，崩溃可能是因为应用内存泄漏、无限循环或其他异常情况。为了进一步提升崩溃恢复机制，可以使用 **健康检查**，定期检查应用是否正常运行。通过外部服务（如 Pingdom 或自定义脚本）来监控应用的健康状态，如果发现应用异常，可以触发重启操作。

### 示例：通过外部健康检查触发重启

1. 创建一个健康检查脚本，检测应用是否在正常运行：

```bash
#!/bin/bash
if ! curl -s http://localhost:3000/health | grep "OK"; then
  pm2 restart my-app
fi
```

2. 使用 `cron` 定时任务每分钟运行此脚本：

```bash
* * * * * /path/to/health-check.sh
```

通过这种方式，应用如果出现异常或无法响应时，会自动触发重启。

## 4. **平滑重启**

当应用崩溃并重新启动时，平滑重启可以保证应用的连续性。在生产环境中，使用 `pm2 reload` 进行平滑重启，可以确保在不中断服务的情况下重启应用。

### 使用平滑重启

```bash
pm2 reload my-app
```

`pm2 reload` 命令会在不中断用户请求的情况下重启应用，适用于高可用的生产环境。

## 5. **自定义崩溃恢复策略**

你可以根据实际需求，编写自定义的崩溃恢复策略。例如，监控进程的 CPU 使用率、内存消耗等，当这些资源消耗过高时，可以主动进行重启操作。

### 示例：基于 CPU 使用率触发重启

```javascript
const pm2 = require('pm2');

pm2.connect(function (err) {
  if (err) {
    console.error(err);
    process.exit(2);
  }

  pm2.start({
    name: 'my-app',
    script: './app.js',
    autorestart: false,  // 禁用 PM2 自动重启
  }, function (err, apps) {
    if (err) throw err;

    // 自定义逻辑：监控 CPU 使用率
    setInterval(() => {
      const cpuUsage = getCPUUsage(); // 假设获取 CPU 使用率的函数
      if (cpuUsage > 80) {
        pm2.restart('my-app', (err) => {
          if (err) console.error('Restart failed');
        });
      }
    }, 10000); // 每 10 秒检查一次 CPU 使用率
  });
});
```

## 6. **总结**

PM2 的崩溃恢复机制是确保 Node.js 应用高可用性的关键功能。通过合理配置自动重启、文件监控、健康检查和资源监控，可以确保应用在崩溃后迅速恢复，并保持持续稳定运行。结合平滑重启和自定义恢复策略，PM2 可以满足不同场景下的高可用性需求，帮助开发者高效地管理应用生命周期。
