如何运行pm2以便其他服务器用户能够访问该进程?

Nik*_*iko 25 node.js multiple-users forever pm2 server

当我开始与我的应用程序的NodeJS PM2,其他服务器的用户都无法访问该进程.

即使我从自定义目录(不是当前用户~/,默认情况下pm2正在使用)启动pm2 :

HOME=/var/www pm2 start app.js
Run Code Online (Sandbox Code Playgroud)

任何用户都可以访问目录(与之相比~/,但是其他服务器用户仍然无法访问该进程.

当其他服务器用户这样做时pm2 list,它会显示0正在运行的进程 - 但是有(由另一个用户启动).当其他用户尝试时HOME=/var/www pm2 list,CLI会抛出错误:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: connect EACCES
    at errnoException (net.js:905:11)
    at Object.afterConnect [as oncomplete] (net.js:896:19)
Run Code Online (Sandbox Code Playgroud)

所以我想知道如何确保用户能够访问其他服务器用户运行的pm2进程?或者它应该以不同的方式接近?


我想知道为什么每个服务器用户都能够git pull从Git存储库部署最新的源代码,但pm2之后无法重启进程?只有启动pm2进程的用户才能重启...很奇怪.

vin*_*ayp 12

这是我们绕过这个的方式.

只需创建一个组

  • 创建一个新组pm2或任何适合您的名称

    $ groupadd pm2

  • /var/www/文件夹组所有者更改为组pm2

    $ chgrp -R pm2 /var/www

  • 将其他用户(比方说bob)添加到pm2

    $ usermod -aG pm2 bob

现在bob可以通过将$ HOME更改为/ var/www来运行pm2命令

$ env HOME=/var/www pm2 list

或者(更好的是)创建@jcollum建议的别名

$ alias pm2='env HOME=/var/www pm2'

  • 抱歉菜鸟的问题。在上面的解决方案中 - 如果用户“bob”使用 pm2 运行某些内容(例如“pm2 list”),它将更改他的 HOME 变量。仅适用于此命令,否则它将是永久性的(在这种情况下,这不是一个好的解决方案,因为许多应用程序都需要此 HOME 变量)。 (2认同)
  • @JanezKranjski 请注意该命令的运行方式:“env HOME=/var/www pm2 list”全部在一行上。在运行命令之前在同一行指定环境变量会在本地为该命令设置该环境变量。因此,当执行完毕后,$HOME 将恢复到其原始值。事实上,从技术上讲,该值从未改变。 (2认同)

小智 8

PM2 似乎是将数据保存在用户的“~/.pm2”文件夹下,因此其他用户无法通过“pm2 status”看到您的 PM2 进程。

我为 PM2 创建了一个新的 linux 用户,所有用户在启动 Pm2 进程之前都使用“su pm2user”:

$ sudo su pm2user
$ sudo pm2 start app.js
Run Code Online (Sandbox Code Playgroud)

这是一种愚蠢的方法,但它很简单,而且效果很好。希望这会有所帮助:)


Ilj*_*ovs 8

好的,这是我针对相同问题的解决方案:

# 1. Create user PM2 and set his password
sudo useradd -d /opt/pm2 -m -s /bin/bash pm2
sudo passwd pm2

# 2. Add users you want to provide the access to PM2 to PM2 group
sudo usermod -aG pm2 <username>

# Note: if you added yourself to pm2 group, perform logout and login back to the host machine   

# 3. Set the PM2_HOME variable
sudo touch /etc/profile.d/pm2.sh
sudo sh -c 'echo "export PM2_HOME=\"/opt/pm2/.pm2\"" > /etc/profile.d/pm2.sh'
source /etc/profile.d/pm2.sh

# 4. Install the PM2 
# Check the npm prefix if fail: 
# https://docs.npmjs.com/misc/config#prefix
sudo npm install pm2 -g

# 5. Make startup script
sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2

sudo systemctl enable pm2-pm2 && \
sudo systemctl start pm2-pm2 && \
sudo systemctl status pm2-pm2

# 6. Change permission of PM2_HOME
sudo chmod -v g+w /opt/pm2/.pm2

# 7. Check the PM2
pm2 status
Run Code Online (Sandbox Code Playgroud)


小智 5

假设您将 pm2 运行为www-data. 为了访问该 pm2 实例,我这样做:sudo -u www-data HOME=/var/www pm2 list例如。当然,您可以创建一个脚本(例如supm2)来为您执行此操作,这样您就可以supm2 list这样做。


Shr*_*noy 1

我也遇到过类似的问题。原因可能是您没有所需的权限,或者您不拥有 pm2 创建的 pid 和 sock 文件。就我而言,当我从命令行而不是启动启动 pm2 时,它工作正常。当我使用启动时,它默认以 root 用户身份运行。所以 root 是 pid、sock 文件的所有者