it-swarm.com.de

Wie führe ich pm2 aus, damit andere Server-Benutzer auf den Prozess zugreifen können?

Wenn ich meine Nodejs-App mit pm2 starte, können andere Serverbenutzer nicht auf den Prozess zugreifen.

Selbst wenn ich pm2 aus einem benutzerdefinierten Verzeichnis starte (nicht ~/ des aktuellen Benutzers, was pm2 standardmäßig verwendet):

HOME=/var/www pm2 start app.js

Verzeichnis ist für jeden Benutzer zugänglich (im Vergleich zu ~/, aber es gibt noch keine Möglichkeit, dass andere Server-Benutzer auf den Prozess zugreifen können.

Wenn ein anderer Serverbenutzer pm2 list verwendet, zeigt er an, dass 0 Prozesse ausgeführt werden - es gibt jedoch (von einem anderen Benutzer gestartet). Wenn ein anderer Benutzer HOME=/var/www pm2 list versucht, gibt CLI einen Fehler aus:

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)

Ich frage mich also, wie kann ich sicherstellen, dass Benutzer auf pm2-Prozesse zugreifen können, die von anderen Serverbenutzern ausgeführt werden? Oder soll es anders angegangen werden?


Ich wundere mich, warum jeder Serverbenutzer in der Lage ist, git pull den neuesten Quellcode aus einem Git-Repository bereitzustellen, aber den pm2-Prozess danach nicht erneut starten kann. Nur der Benutzer, der den pm2-Prozess gestartet hat, kann ihn neu starten.

17
Nik Sumeiko

So haben wir das umgangen.

Erstellen Sie einfach eine Gruppe

  • Erstellen Sie eine neue Gruppe pm2 oder einen beliebigen anderen Namen

    $ groupadd pm2

  • Ändern Sie den Besitzer der Ordnergruppe /var/www/ in die Gruppe pm2.

    $ chgrp -R pm2 /var/www

  • Fügen Sie den anderen Benutzer, sagen wir bob, zu pm2 hinzu

    $ usermod -aG pm2 bob

Jetzt kann bob pm2-Befehle ausführen, indem er $ HOME in/var/www ändert.

$ env HOME=/var/www pm2 list

Oder (noch besser) einen Alias ​​erstellen, wie von @jcollum vorgeschlagen

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

8
vinayp

Es scheint, dass PM2 Daten im Ordner "~/.pm2" des Benutzers speichert, sodass andere Benutzer Ihren PM2-Prozess nicht mit dem Status "pm2" sehen können. 

Ich habe einen neuen Linux-Benutzer für PM2 erstellt, und alle Benutzer verwenden 'su pm2user', bevor Sie den Pm2-Prozess starten:

$ Sudo su pm2user
$ Sudo pm2 start app.js

Es ist ein dummer Weg, aber es ist einfach und funktioniert gut. Hoffe das würde helfen :)

4
Allen Kung

Ok, hier ist meine Lösung für dasselbe Problem:

  1. PM2-Basisverzeichnis erstellen: Sudo mkdir /opt/pm2
  2. Benutzer pm2 erstellen: Sudo useradd -d /opt/pm2 -M -r -s /bin/false pm2
  3. Fügen Sie alle erforderlichen Benutzer der Gruppe pm2 hinzu: Sudo usermod -aG pm2 <username>
  4. Besitzer von / opt/pm2 festlegen: Sudo chown pm2:pm2 /opt/pm2
  5. Berechtigungen ändern: Sudo chmod 770 /opt/pm2
  6. Umgebungsvariable setzen (Ich verwende / etc/environment): PM2_HOME=/opt/pm2
  7. Installieren Sie pm2: Sudo npm install pm2 -g. Mein npm-Präfix ist auf / usr/local gesetzt. 
  8. Führen Sie Sudo pm2 startup aus. Es wird ein Startskript für Ihr System generiert (in meinem Fall handelt es sich um Ubuntu Server).
  9. Öffnen Sie das Startskript (in meinem Fall /etc/init.d/pm2-init.sh) und bearbeiten Sie die folgenden Variablen USER=pm2 ... export PM2_HOME="/opt/pm2"

In meinem Raspberry Pi habe ich ein Problem mit der Vererbung von Socket-Dateiberechtigungen erhalten. Sie werden für die Gruppe schreibgeschützt, anstatt dass rwx auf das Basisverzeichnis angewendet wird: 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

Nach stundenlangem Googeln fand ich schließlich die Lösung: Ich fügte dem Startskript die folgende Zeile hinzu: umask 0002 Und bekam es: srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock

Das ist alles.

Update:

Nehmen wir an, Sie haben pm2 user erstellt, es ist das Home-Verzeichnis und wurde der Gruppe pm2 hinzugefügt. 

Ausgehend von dem Punkt 6 können die Dinge auf folgende Weise ausgeführt werden:

  1. Sudo npm install pm2 -gDenken Sie an das npm-Präfix!
  2. Erstellen Sie die Datei pm2.sh im Verzeichnis /etc/profile.d/ und geben Sie dort die folgende Zeile ein: export PM2_HOME=/opt/pm2/.pm2. Nun wird die Umgebungsvariable PM2_HOME nach dem Login jedem Benutzer angezeigt.
  3. Um ein Startskript zu erstellen , führe den folgenden Befehl aus: Sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2
  4. Überprüfen Sie den Status des Dienstes: Sudo systemctl status pm2-pm2

Sie können den pm2-Dienst wie folgt umbenennen:

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

Angenommen, Sie führen pm2 als www-data aus. Um auf diese pm2-Instanz zugreifen zu können, mache ich zum Beispiel: Sudo -u www-data HOME=/var/www pm2 list. Sie können natürlich ein Skript erstellen (z. B. supm2), das dies für Sie erledigt, sodass Sie stattdessen einfach supm2 list ausführen können.

1
Diego Luces

Ich bin mit einem ähnlichen Problem konfrontiert. Der Grund dafür kann sein, dass Sie nicht über die erforderlichen Berechtigungen verfügen oder die von pm2 erstellten pid- und sock-Dateien nicht besitzen. In meinem Fall hat es gut funktioniert, als ich das pm2 von der Kommandozeile aus gestartet habe und nicht vom Start. Bei der Verwendung von Start wurde es standardmäßig als Root-Benutzer ausgeführt. Root war also der Besitzer der PID-Socken-Dateien

0
Shrinath Shenoy

Ich weiß, dass ich zu spät zur Party komme, aber so habe ich es gemacht:

PM2="/usr/share/nodejs/pm2"
USER="me"
useradd $USER
groupadd pm2
chgrp -R pm2 $PM2
usermod -aG pm2 $USER
setfacl -Rdm g:pm2:rwx $PM2

/ etc/bash.bashrc etc

export PM2_HOME=$PM2;
0
crankshaft