等待 mongodb 准备就绪,然后在重启时启动 pm2 进程

Wait for mongodb to be ready before starting pm2 process on reboot

我无法让 pm2 等待 mongodb 准备就绪,然后才能在系统重启时启动进程。 (我正在使用 Ubuntu 16.04 服务器)

在我的 pm2 systemd 服务文件中我有这个,我认为它会等到 mongodb 启动之后:

[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
Wants=mongod.service
After=network.target mongod.service

[Service]
Type=forking

但它似乎运行 pm2,因此 pm2 在 mongodb 之前启动的 node.js 进程实际上已准备好在 27017 上侦听。我的错误日志显示我的 node.js 脚本无法在 27017 上找到数据库。但是如果我手动重新启动进程(在 mongodb 有足够的时间准备好之后)它工作得很好。

如何延迟 pm2 启动,或延迟 pm2 启动特定应用程序直到 mongodb 准备好并侦听连接

注意:我试过添加

ExecStartPost=/bin/sh -c 'while ! /usr/bin/mongo --eval "db.version()" > /dev/null 2>&1; do sleep 0.1; done'

我的 mongod.service 根据这个回答:Systemd: Autostart service after mongodb,但这完全阻止了 pm2 启动。

我只是 运行 遇到了这个完全相同的问题,我最终找到的解决方案是让 pm2 也启动 mongodb。只要在启动 npm 之前启动 mongodb,然后在让 pm2 生成启动脚本之前保存当前进程列表,一切都很好。

因此,要让 pm2 达到 运行 mongodb,您需要创建一个 shell 脚本,让 pm2 可以 运行。这是我的 mongod.sh 文件的样子:

#!/bin/bash
sudo mongod

我把 mongod.sh 文件放在我的用户目录中,然后像这样用 pm2 启动它和 npm:

pm2 start ~/mongod.sh
pm2 start npm

您可以通过 运行ning

检查以确保两个脚本都是 运行 pm2 并且顺序正确
pm2 status

在此过程中,您应该同时看到 mongod 和 npm 运行ning 并且 mongod 的 id 应该为 0(或仅低于 npm 进程)。

一旦我同时拥有 mongod 和 npm 运行 pm2,我保存了 pm2 进程列表并重置了启动脚本:

pm2 save
pm2 unstartup
pm2 startup