【问题标题】:PM2 on vagrant - starting app AFTER shared folder is mountedvagrant 上的 PM2 - 安装共享文件夹后启动应用程序
【发布时间】:2016-07-06 03:28:07
【问题描述】:

如何设置 PM2 在共享目录挂载后启动应用程序?默认情况下pm2 startup 添加脚本,该脚本会在操作系统启动后立即运行脚本,这会导致程序错误(因为此时文件夹尚未挂载)。

【问题讨论】:

  • 如何启动您的应用程序?默认情况下,如果您使用 vagrant 的任何配置,它们将在共享文件夹挂载后运行,您可以从运行 vagrant up 的输出中看到,您将在任何配置之前看到 Mounting shared folder...步骤
  • pm2 日志中的应用程序有以下错误:index-0 (err): chdir(): No such file or directory 出现在 vagrant boot 上,所以我猜测它是由未安装的文件夹引起的。在手动 pm2 stoppm2 start 之后,它运行完美
  • 你如何启动你的应用程序?你有初始化脚本吗,通过 vagrant provision ...
  • 不,我没有。我正在使用 cd /vagrant/project/ && npm start (启动 /vagrant/project/server/index.js)手动启动应用程序。我通过命令设置了 pm2:pm2 start /vagrant/project/server/index.js 并使用了pm2 startup 但结果在上面解释了
  • 所以当您执行cd /vagrant 时,您指向的是一个共享文件夹,因此它已正确安装。问题不在于安装共享文件夹

标签: node.js vagrant pm2


【解决方案1】:

您可以在 Vagrantfile 中添加以下行

config.vm.provision :shell, :inline => "pm2 start /vagrant/project/server/index.js && pm2 startup", :run => 'always', privileged: false

阅读shell provisioning

  • inline (string) - 指定在远程机器上执行的内联 shell 命令。

当您 ssh 进入该框时,您将在此处输入命令行

  • privileged (boolean) - 指定是否以特权用户身份执行 shell 脚本 (sudo)。默认情况下这是“真”。

在您的情况下,设置为 false 以便 vagrant 用户运行此命令

默认情况下,provisioners 只运行一次,在自最后一个 vagrant destroy 之后的第一个 vagrant up 期间,除非设置了 --provision 标志,如上所述。

(可选)您可以将配置程序配置为在每个 upreload 上运行。仅当显式指定 --no-provision 标志时,它们才会运行。为此,请将run 选项设置为“始终”

设置为always,所以它会在您启动虚拟机时启动 pm2

如果你想运行多个命令你也可以这样写

config.vm.provision "shell", run: "always", privileged: false, inline: <<-SHELL
    pm2 start /vagrant/project/server/index.js
    pm2 startup
    .... any command that you want to execute ....
  SHELL

【讨论】:

  • 由于 pm2 与 vagrant 的兼容性问题,它更像是解决方法而不是问题的解决方案,但它仍然解决了问题,所以我将此答案标记为已接受。谢谢楼主
猜你喜欢
  • 2016-09-08
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2016-03-28
  • 2016-03-21
  • 1970-01-01
相关资源
最近更新 更多