在重新启动时启动 pm2 进程之前等待 mongodb 准备就绪

Ada*_*m D 5 mongodb node.js systemd pm2 ubuntu-16.04

我在让 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
Run Code Online (Sandbox Code Playgroud)

但它似乎运行 pm2,因此 node.js 进程在 mongodb 实际上准备在 27017 上侦听之前启动 pm2。我的错误日志显示我的 node.js 脚本在 27017 上找不到 db。但是如果我手动重新启动了这个过程(在 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 启动。

Col*_*lin 1

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

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

#!/bin/bash
sudo mongod
Run Code Online (Sandbox Code Playgroud)

我将该 mongod.sh 文件放在我的用户目录中,然后启动它并使用 pm2 启动 npm,如下所示:

pm2 start ~/mongod.sh
pm2 start npm
Run Code Online (Sandbox Code Playgroud)

您可以通过运行来检查以确保两个脚本都在使用 pm2 运行并且按正确的顺序运行

pm2 status
Run Code Online (Sandbox Code Playgroud)

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

当 mongod 和 npm 都与 pm2 一起运行后,我保存了 pm2 进程列表并重置了启动脚本:

pm2 save
pm2 unstartup
pm2 startup
Run Code Online (Sandbox Code Playgroud)