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

时间:2018-07-08 10:58:06

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

我无法让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,因此在mongodb实际准备好监听27017之前,node.js会处理pm2启动。我的错误日志显示,我的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的启动。

1 个答案:

答案 0 :(得分: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过程)。

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

pm2 save
pm2 unstartup
pm2 startup