我正在使用vagrant机器和pm2。我使用以下方法创建了启动脚本:
pm2 update ubuntu
然后通过
转储所有正在运行的进程pm2 save
然而,当我通过流浪汉重装加载流浪汉机器。所有过程都具有以下状态:
如果我使用
更新它pm2 update
所有流程都会重新上线。如果我杀死并复活所有过程,即使再回到网上也是如此。 只有当流浪汉重新启动时才会出错。
PM2日志提供以下错误
Error: spawn node ENOENT
at exports._errnoException (util.js:856:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:179:32)
at onErrorNT (internal/child_process.js:345:16)
at nextTickCallbackWith2Args (node.js:455:9)
at process._tickDomainCallback (node.js:410:17)
我已经尝试了所有可能的解决方案,到目前为止,我没能工作。
注意:重新启动主机Ubuntu计算机时,相同的步骤可以正常运行。
答案 0 :(得分:0)
所以,我在寻找同样的问题时发现了这个问题。最后我意识到问题是在Vagrant挂载共享目录之前,PM2启动脚本正在执行。因此,PM2在重新启动时无法找到您的脚本。这就是为什么它在Vagrant完成后你可以使用SSH并重新运行PM2的原因。到那时,Vagrant已经重新安装了您的共享目录。我发现解决此问题的一种方法是使用rsync,这样重启时文件就已经在VM上了。
答案 1 :(得分:-1)
正如Jason的回答所说,这是由加载和挂载共享目录的顺序引起的。
基本解决方案是使用vagrant的shell配置,通过向您的vagrant文件添加类似于以下内容的东西(在您处理挂载共享目录的部分之后):
config.vm.provision :shell, :inline => "pm2 start /vagrant/project/server/index.js && pm2 startup", :run => 'always', privileged: false
这将导致Vagrant在调用vagrant up
时运行此行,这由:run => 'always'
选项保证,这意味着它始终运行,而不仅仅在vagrant provision
上运行config.vm.provision
来源:PM2 on vagrant - starting app AFTER shared folder is mounted