如何运行pm2以便其他服务器用户能够访问该进程?
当我用pm2启动我的Nodejs应用程序时,其他服务器用户无法访问该进程。
即使我从一个自定义目录启动pm2(不是当前用户的~/
,pm2默认使用的是什么):
HOME=/var/www pm2 start app.js
任何用户都可以访问目录 (与~/
比较),但其他服务器用户仍然无法访问该进程。
当其他服务器用户做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)
所以我想知道如何确保用户能够访问其他服务器用户运行的pm2进程? 还是应该有不同的接近?
我想知道为什么每个服务器用户能够使git pull
从Git存储库部署最新的源代码,但不能重新启动pm2
过程之后? 只有启动pm2
进程的用户才能重新启动它…奇怪。
以下是我们如何绕过这一点。
只需创build一个组
-
创build一个新的小组
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
或者(更好的是)像@jcollumbuild议的那样创build一个别名
$ alias pm2='env HOME=/var/www pm2'
看来PM2在用户的'〜/ .pm2'文件夹下保存了数据,所以其他用户不能用'pm2 status'来查看你的PM2进程。
我为PM2创build了一个新的linux用户,所有用户在启动Pm2进程之前使用'su pm2user':
$ sudo su pm2user $ sudo pm2 start app.js
这是一个愚蠢的方式,但它很简单,运作良好。 希望这会帮助:)
好的,这里是我的解决scheme相同的问题:
- 创buildPM2主目录:
sudo mkdir /opt/pm2
- 创build用户pm2 :
sudo useradd -d /opt/pm2 -M -r -s /bin/false pm2
- 将所有需要的用户添加到
sudo usermod -aG <username>
组:sudo usermod -aG <username>
- 设置/ opt / pm2的所有者:
sudo chown pm2:pm2 /opt/pm2
- 更改权限:
sudo chmod 770 /opt/pm2
- 设置环境variables(我正在使用/ etc / environment ):
PM2_HOME=/opt/pm2
- 安装pm2:
sudo npm install pm2 -g
。 我的npm前缀被设置为/ usr / local 。 - 运行
sudo pm2 startup
。 它会为你的系统生成启动脚本(在我的情况下是Ubuntu服务器)。 - 打开启动脚本(在我的情况下是/etc/init.d/pm2-init.sh )并编辑下列variables
USER=pm2 ... export PM2_HOME="/opt/pm2"
在我的树莓派我得到了套接字文件权限inheritance的问题,他们被设置为只读组而不是rwx应用于家庭目录: srwxr-xr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxr-xr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock
经过几个小时的search,我终于find了解决办法:我添加了以下行到启动脚本: umask 0002
并得到它: srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock
就这样。
假设你运行pm2作为www-data
。 要访问pm2实例,我需要: sudo -u www-data HOME=/var/www pm2 list
。 当然,你可以创build一个脚本(例如supm2
)来为你做,所以你可以做supm2 list
。
我遇到了类似的问题。 原因可能是您没有所需的权限,或者您没有拥有由pm2创build的pid和sock文件。 就我而言,当我从命令行启动pm2而不是启动时,它工作正常。 当我使用启动时,它默认以root用户身份运行。 所以root是pid,sock文件的所有者