web-dev-qa-db-fra.com

Comment passer des arguments à l'application en utilisant pm2?

J'utilise pm2 pour démarrer mon application mais je ne peux pas lui transmettre d'argument. la commande que j'utilise est pm2 start app.js - dev. Bien que cela fonctionne avec pour toujours.

58
user3373581

Vous pouvez faire ce qui est indiqué dans ce ticket: https://github.com/Unitech/pm2/issues/1

Toutefois, si vous dépassez l'environnement, vous voudrez peut-être utiliser les variables d'environnement. Avec cela, vous créez une variable accessible par tout processus de cet environnement avec process.env.*.

Donc vous avez un fichier de configuration 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"]
        }
   }
}

Ensuite, vous importez votre configuration:

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

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

Ensuite, vous définissez la variable dans votre environnement via Shell:

export NODE_ENV=staging
pm2 start app.js

La variable d'environnement durera aussi longtemps que votre session. Vous devrez donc le définir dans le ~/.bashrc fichier pour cet utilisateur que la variable doit conserver. Cela définira la variable à chaque session.

PM2 a un deploy system qui vous permet de définir une variable d'environnement chaque fois avant que votre application ne soit démonisée. C'est ainsi que les démons des systèmes POSIX acceptent généralement les paramètres, car ils ne sont pas perdus avec le processus. Compte tenu de votre situation, cela n’aura peut-être pas beaucoup d’importance, mais c’est une bonne pratique.

De plus, vous devez envisager d’arrêter/de démarrer localement et de redémarrer (si vous êtes en mode cluster) chaque fois que cela est possible pour éviter les temps morts en production.

23
tsturzl

Si vous voulez passer les arguments de noeud de la CLI, alors

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

.

Edité

vous pouvez ajouter des arguments après --

pm2 start app.js -- --prod

Documents de voiles pour deploymemt .

112
Nishchit Dhanani

Il est possible de définir des arguments avec le processus.

Vous pouvez définir un nouveau processus dans ecosystem.config.js avec une clé args, comme ceci:

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

Ici, les deux processus utilisent le même fichier (service.js), mais transmettez-lui des arguments différents.

Notez que ces arguments sont gérés dans service.js. Dans mon cas, je viens d'utiliser process.argv[2] pour obtenir le premier argument, et ainsi de suite.

13
Travis

Vous pouvez envoyer des arguments à votre script en les passant après --. Par exemple: pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js

5
Alex

Eh bien, vous pouvez faire passer les paramètres de pm2 à nodejs dans CLI de deux manières différentes:

  • pm2 start app.js - dev --port = 1234 (remarque: il y a un espace supplémentaire entre - et dev)
  • pm2 start app.js --node-args = "dev --port = 1234"

Dans les deux cas, vous constaterez que ces valeurs existent dans process.argv (['dev', '- port = 1234'])

1
Xin

À partir de la pm2 docs

//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
0
kenny