web-dev-qa-db-fra.com

Comment exécuter pm2 afin que les autres utilisateurs du serveur puissent accéder au processus?

Lorsque je démarre mon application Nodejs avec pm2 , les autres utilisateurs du serveur ne peuvent pas accéder au processus.

Même si je lance pm2 à partir d'un répertoire personnalisé (pas ~/ de l'utilisateur actuel, ce que pm2 utilise par défaut):

HOME=/var/www pm2 start app.js

Le répertoire est accessible à n'importe quel utilisateur} _ (comparé à ~/, mais aucun autre utilisateur du serveur ne peut toujours accéder au processus.

Lorsqu'un autre utilisateur du serveur exécute pm2 list, il lui indique que 0 processus sont en cours d'exécution - mais il y en a (démarrés par un autre utilisateur). Et quand un autre utilisateur essaie HOME=/var/www pm2 list, la CLI lève une erreur:

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)

Je me demande donc comment faire en sorte que les utilisateurs puissent accéder aux processus pm2 exécutés par d’autres utilisateurs du serveur? Ou il doit être abordé différemment?


Je me demande pourquoi chaque utilisateur de serveur est capable de faire git pull pour déployer le dernier code source à partir d'un référentiel Git, mais ne peut pas redémarrer le processus pm2 après? Seul l'utilisateur qui a lancé le processus pm2 peut le redémarrer… Bizarre.

17
Nik Sumeiko

Voici comment nous avons contourné cela.

Il suffit de créer un groupe

  • Créez un nouveau groupe pm2 ou le nom qui vous convient

    $ groupadd pm2

  • Remplacez le propriétaire du groupe de dossiers /var/www/ par le groupe pm2

    $ chgrp -R pm2 /var/www

  • Ajoutez l'autre utilisateur, disons bob, à pm2

    $ usermod -aG pm2 bob

Bob peut maintenant exécuter les commandes pm2 en modifiant $ HOME en/var/www

$ env HOME=/var/www pm2 list

Ou (mieux encore) créer un alias comme suggéré par @jcollum

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

8
vinayp

Il semble que PM2 enregistre les données dans le dossier "~/.pm2" de l'utilisateur. Par conséquent, les autres utilisateurs ne peuvent pas voir votre processus PM2 avec le statut "pm2". 

J'ai créé un nouvel utilisateur linux pour PM2, et tous les utilisateurs utilisent 'su pm2user' avant de lancer le processus Pm2:

$ Sudo su pm2user
$ Sudo pm2 start app.js

C'est une manière stupide, mais c'est simple et fonctionne bien. J'espère que cela aiderait :)

4
Allen Kung

Ok, voici ma solution pour le même problème:

  1. Créer un répertoire personnel PM2: Sudo mkdir /opt/pm2
  2. Créer l'utilisateur pm2: Sudo useradd -d /opt/pm2 -M -r -s /bin/false pm2
  3. Ajoutez tous les utilisateurs requis au groupe pm2: Sudo usermod -aG pm2 <username>
  4. Définir le propriétaire de / opt/pm2: Sudo chown pm2:pm2 /opt/pm2
  5. Changer les permissions: Sudo chmod 770 /opt/pm2
  6. Définir la variable d'environnement (j'utilise / etc/environment): PM2_HOME=/opt/pm2
  7. Installez pm2: Sudo npm install pm2 -g. Le préfixe Mine npm est défini sur / usr/local
  8. Exécutez Sudo pm2 startup. Il générera un script de démarrage pour votre système (dans mon cas, il s'agit du serveur Ubuntu).
  9. Ouvrez le script de démarrage (encore une fois, dans mon cas, il s'agit de /etc/init.d/pm2-init.sh) et modifiez les variables suivantes USER=pm2 ... export PM2_HOME="/opt/pm2"

Dans mon Raspberry Pi, j'ai un problème avec l'héritage des permissions du fichier de socket, ils sont définis en lecture seule pour le groupe au lieu de rwx est appliqué au répertoire personnel: 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

Après des heures de recherches sur Google, j'ai finalement trouvé la solution: j'ai ajouté la ligne suivante au script de démarrage: umask 0002 Et je l'ai obtenue: srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock

C'est tout.

Mettre à jour:

Supposons que vous avez créé pm2 user, son répertoire personnel et que vous vous êtes ajouté au groupe pm2

Maintenant, à partir du point 6 , les choses peuvent être faites de la manière suivante:

  1. Sudo npm install pm2 -gRappelez-vous du préfixe npm!
  2. Créez le fichier pm2.sh dans le répertoire /etc/profile.d/ et mettez-y la ligne suivante: export PM2_HOME=/opt/pm2/.pm2. Maintenant, la variable d'environnement PM2_HOME sera présentée à chaque utilisateur après la connexion.
  3. Pour créer un script de démarrage , exécutez la commande suivante: Sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2
  4. Vérifier l'état du service: Sudo systemctl status pm2-pm2

Vous pouvez renommer le service pm2 comme suit:

Sudo systemctl stop pm2-pm2
Sudo mv /etc/systemd/system/pm2-pm2.service /etc/systemd/system/pm2.service
Sudo systemctl start pm2
3
Ilja Denisovs

En supposant que vous exécutiez pm2 en tant que www-data. Pour avoir accès à cette instance pm2, je fais: Sudo -u www-data HOME=/var/www pm2 list par exemple. Vous pouvez bien sûr créer un script (par exemple, supm2) qui le fait pour vous afin que vous puissiez simplement faire supm2 list à la place.

1
Diego Luces

J'ai fait face à un problème similaire. La raison peut en être que vous ne disposez pas des autorisations requises ou que vous ne possédez pas les fichiers pid et sock créés par pm2. Dans mon cas, cela fonctionnait bien lorsque j'ai démarré pm2 à partir de la ligne de commande au lieu de démarrer. Lorsque j'ai utilisé le démarrage, il s'exécutait en tant qu'utilisateur root par défaut. Donc, root était le propriétaire des fichiers pid, sock

0
Shrinath Shenoy