Wie übergebe ich Argumente mit pm2 an die App?

73

Ich verwende pm2, um meine App zu starten, kann jedoch kein Argument an sie übergeben. Der Befehl, den ich verwende, ist pm2 start app.js - dev. Obwohl dies für immer funktioniert.

user3373581
quelle

Antworten:

26

Sie können wie in diesem Ticket angegeben vorgehen: https://github.com/Unitech/pm2/issues/13

Wenn Sie die Umgebung übergeben, sollten Sie möglicherweise Umgebungsvariablen nutzen. Damit erstellen Sie eine Variable, auf die jeder Prozess in dieser Umgebung mit zugreifen kann process.env.*.

Sie haben also eine Konfigurationsdatei config.json:

{
   "dev": {
        "db": {
            "hosts":["localhost"],
            "database": "api"
        },
        "redis": {
            "hosts": ["localhost"]
        }
   },
   "staging": {
        "db": {
            "hosts":["1.1.1.1"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2"]
        }
   },
   "production": {
        "db": {
            "hosts":["1.1.1.1", "1.1.1.2", "1.1.1.3"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2", "2.2.2.3"]
        }
   }
}

Dann importieren Sie Ihre Konfiguration:

var config=require('./config.json')[process.env.NODE_ENV || 'dev'];

db.connect(config.db.hosts, config.db.database);

Dann würden Sie die Variable in Ihrer Umgebung über die Shell festlegen:

export NODE_ENV=staging
pm2 start app.js

Die Umgebungsvariable hält so lange wie Ihre Sitzung. Sie müssen es also in der ~/.bashrcDatei für diesen Benutzer festlegen, damit die Variable bestehen bleibt. Dadurch wird die Variable bei jeder Sitzung festgelegt.

PM2 verfügt über ein Bereitstellungssystem, mit dem Sie jedes Mal eine Umgebungsvariable festlegen können, bevor Ihre App dämonisiert wird. Auf diese Weise nehmen Daemons in POSIX-Systemen normalerweise Parameter an, da diese Parameter beim Prozess nicht verloren gehen. Angesichts Ihrer Umstände ist es vielleicht nicht so wichtig, aber es ist eine gute Praxis.

Darüber hinaus sollten Sie in Betracht ziehen, lokal zu stoppen / zu starten und nach Möglichkeit neu zu starten (falls im Cluster-Modus), um Ausfallzeiten in der Produktion zu vermeiden.

tsturzl
quelle
Ich habe dies mit AWS Code Deploy und meiner Node.JS-Anwendung eingerichtet und es funktioniert wunderbar. Ich verwende Port 4040 lokal und 80 unter AWS. Dies ist eine elegante Lösung, um sicherzustellen, dass meine Ports korrekt eingerichtet sind. Vielen Dank!
BuffMcBigHuge
142

Wenn Sie Knotenargumente von der CLI übergeben möchten, dann

pm2 start myServer.js --node-args="--production --port=1337"

.

Bearbeitet

Sie können nachher beliebige Argumente hinzufügen --

pm2 start app.js -- --prod --second-arg --third-arg

Sails docs für deploymemt .

Nishchit Dhanani
quelle
1
Das ist gut. Aber wenn es an Docker übergeben wird, funktioniert dies nicht. Kann mir jemand bitte helfen. . ENTRYPOINT ["pm2"] CMD ["start", "msg / myServer.js", "--node-args = '- firstarg'", "- no-daemon"]
Raj Rajen
1
@ RajRajen: Wenn Sie Docker verwenden, ist PM2 meiner Meinung nach nicht die beste Option. Lassen Sie Docker entweder Ihre App überwachen und verwenden Sie die Neustartrichtlinie, um Ihre App am Leben zu erhalten, oder verwenden Sie Supervisord, damit Ihr Container nicht jedes Mal neu gestartet werden muss, wenn Ihre App ausfällt. Wenn Sie PM2 im Docker ausführen, verlieren Sie viele nützliche Funktionen von PM2 und alles, was es wirklich tut, ist, Ihre App am Leben zu erhalten. Zu diesem Zeitpunkt wäre die Verwendung für immer oder ein Init-System genauso gut und wahrscheinlich einfacher. Supervisord ist extrem häufig bei Docker-Containern, auf denen mehr als ein Dienst pro Container ausgeführt wird.
tsturzl
3
Für Docker können Sie den dedizierten PM2-Befehl pm2-docker verwenden. Weitere Informationen hier: pm2.keymetrics.io/docs/usage/docker-pm2-nodejs
Unitech
Ich möchte nur beachten, dass in der JSON-Konfigurationsdatei die Feldnamen argsundnode-args
Dave
1
Laut pm2.keymetrics.io/docs/usage/quick-start müssen Sie nur hinzufügen - und alles, was danach kommt, wird als Argument übergeben. es besteht keine Notwendigkeit für -x; -x bedeutet, einen Befehl mit dem Gabel-System auszuführen
Nick Steele
17

Es ist möglich, Argumente mit dem Prozess zu definieren.

Sie können einen neuen Prozess ecosystem.config.jsmit einem argsSchlüssel wie folgt definieren:

{
  name            : 'my-service',
  script          : './src/service.js',
  args            : 'firstArg secondArg',
},
{
  name            : 'my-service-alternate',
  script          : './src/service.js',
  args            : 'altFirstArg altSecondArg',
}

Hier verwenden die beiden Prozesse dieselbe Datei ( service.js), übergeben ihr jedoch unterschiedliche Argumente.

Beachten Sie, dass diese Argumente in behandelt werden service.js. In meinem Fall habe ich nur process.argv[2]das erste Argument bekommen und so weiter.

Travis
quelle
Dies ist eine bessere Lösung, wenn Sie eine fortlaufende (dauerhafte) Konfiguration wünschen. Ich denke, Sie haben den Teil über die Verwendung verpasst ecosystem.config.js. Wie zum Beispielpm2 start ecosystem.config.js
HankCa
10

Sie können Argumente an Ihr Skript senden, indem Sie sie anschließend übergeben --. Zum Beispiel:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js

Alex
quelle
2

Nun, es gibt zwei Möglichkeiten, wie Sie die Parameter von pm2 an nodejs in der CLI übergeben können:

  • pm2 start app.js - dev --port = 1234 (beachten Sie, dass zwischen - und dev ein zusätzliches Leerzeichen steht)
  • pm2 start app.js --node-args = "dev --port = 1234"

In beiden Fällen finden Sie diese Werte in process.argv(['dev', '- port = 1234'])

Xin
quelle
1

Aus den pm2- Dokumenten

//Inject what is declared in env_production
$ pm2 start app.js --env production 

//Inject what is declared in env_staging
$ pm2 restart app.js --env staging
kenny
quelle
1

Sie können Argumente für den Knoten einfach so übergeben:

NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server
Onsmak
quelle
0

Sie müssen pm2 wie folgt starten: pm2 start app.js --name "app_name" - arg1 arg2

Dann können Sie in Ihrem Code Ihre Argumente abrufen mit: console.log (process.argv);

process.argv ist eine Liste wie diese: ['/ usr / local / bin / node', '/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js', 'arg1', 'arg2']

Daian Gan
quelle
0

Ich habe getestet und es funktioniert in meinem Windows-Computer. Unten finden Sie die vollständige Lösung zum Übergeben von Argumenten an die nodejs-App mit pm2.

** Es gibt auch zwei Arten von Argumenten

  1. node-args - vor dem Start von npm zu verwenden
  2. args - zur Verwendung in Ihrem Knotenprogramm

Es gibt zwei Möglichkeiten, Argumente mit pm2 zu übergeben.

Option 1: Argument mit pm2-Befehlen übergeben.

Option 2: Verwenden Sie die Konfigurationsdatei, z. B. ökosystem.config.js

Option 1 (arg durch Befehle übergeben):

pm2 start app/myapp1.js --node-args="--max-http-header-size=80000" -- arg1 arg2
//Access the arg as below in your node program.
console.log(process.argv[2]); // arg1
console.log(process.argv[3]); // arg2

Option 2 (Konfigurationsdatei verwenden): Wenn Sie ökosystem.config.js verwenden . Sie können mit folgender Konfiguration definieren:

    {
      name: 'my-app',
      script: 'app\\myapp1.js',
      env: {
        NODE_ENV: 'DEV',
        PORT : 5051
      },
      node_args: '--max-http-header-size=80000',
      args : 'arg1 arg2',
      instances: 1,
      exec_mode: 'fork'
    }

So starten Sie als Entwicklungsmodus:

pm2 start --name myapp  app/myapp1.js -- .\ecosystem.config.js

Um als Produktionsmodus zu starten, fügen Sie einfach --env = Produktion hinzu

pm2 start --name myapp  app/myapp1.js -- .\ecosystem.config.js --env=production 
//Access the arg as below in your node program.
console.log(process.argv[2]); // arg1
console.log(process.argv[3]); // arg2
junnyea
quelle
0

Ich verwende immer PM2, um meine Python-Skripte in einer Linux-Umgebung auszuführen. Stellen Sie sich also vor, ein Skript hat einen einzelnen Parameter und muss nach einiger Zeit kontinuierlich ausgeführt werden. Dann können wir es folgendermaßen übergeben:

pm2 start <filename.py> --name <nameForJob> --interpreter <InterpreterName> --restart-delay <timeinMilliseconds> -- <param1> <param2>

filename.pyist Name des Python-Skripts, ohne <> Symbole, ich möchte mit PM2 ausführen
nameForJobist der aussagekräftige Name für den Job, ohne <> Symbole
InterpreterNameist der Python-Interpreter zum Ausführen von Skripten, normalerweise ist es unter python3Linux
timeinMillisecondsdie Zeit, die unser Skript benötigt Warten und erneut ausführen
param1ist der erste Parameter für das Skript
param2ist der zweite Parameter für das Skript.

Prasad Nadiger
quelle