【问题标题】:Wait for mongodb to be ready before starting pm2 process on reboot在重新启动时启动 pm2 进程之前等待 mongodb 准备就绪
【发布时间】:2018-12-16 07:05:26
【问题描述】:

我无法让 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 实际准备好监听 27017 之前启动的 node.js 进程。我的错误日志显示我的 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 的启动。

【问题讨论】:

    标签: node.js mongodb ubuntu-16.04 systemd pm2


    【解决方案1】:

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

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

    #!/bin/bash
    sudo mongod
    

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

    pm2 start ~/mongod.sh
    pm2 start npm
    

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

    pm2 status
    

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

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

    pm2 save
    pm2 unstartup
    pm2 startup
    

    【讨论】:

    • 使用 sudo 用户运行 mongdb 会导致安全问题。有人找到其他解决方案了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多