Comment installer node.js en tant que service Windows?

130

J'ai téléchargé l' exécutable node.js. Comment puis-je exécuter cet exécutable en tant que service Windows? Je ne peux pas utiliser le programme d'installation standard de node.js, car je dois exécuter plusieurs versions de node.js simultanément.

TN.
la source

Réponses:

187

En retard à la fête, mais les fenêtres de nœuds feront également l'affaire.

entrez la description de l'image ici

Il intègre également la journalisation du système.

entrez la description de l'image ici

Il existe une API pour créer des scripts à partir de code, c'est-à-dire

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\helloworld.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

svc.install();

FD: Je suis l'auteur de ce module.

Corey
la source
3
deuxième que "génial". Je viens de suivre vos instructions readme et cela a fonctionné dès la sortie de la boîte - très rare! juste une chose que vous voudrez peut-être ajouter au readme: comment exécuter le script js créé sur la CLI: ie> node set_up_win_service.js ...
mike rodent
@Corey de toute façon que je peux exécuter le package JXCore en tant que service en utilisant ce module?
Madhur
@Madhur - Théoriquement, cela pourrait fonctionner, mais je ne l'ai pas fait et je n'ai pas l'intention de le tester. node-windows utilise un fichier wrapper.js responsable de la surveillance / des redémarrages. Cela lance simplement le script de nœud en tant que processus enfant. Il est également possible de configurer le chemin de l'exécutable (c'est-à-dire jx au lieu de node). Donc, en théorie, vous pourriez probablement faire cela, mais je n'ai aucune idée du genre de bizarreries que vous pourriez potentiellement rencontrer.
Corey
@Corey J'ai une simple application Http Node mais elle ne semble pas continuer à fonctionner en utilisant ce service. Il s'installe et démarre correctement, mais il s'arrête immédiatement. Toute aide serait grandement appréciée monsieur! L'observateur d'événements n'affiche aucune erreur, mais un avertissement: Processus enfant [50732 - C: \ Program Files \ nodejs \ node.exe --harmony "C: \ Users \ bmechkov \ AppData \ Roaming \ npm \ node_modules \ node-windows \ lib \ wrapper.js "-f" C: \ dev \ Node \ abs_tips \ server.js "-l" NODE ABS TIPS "-g 0,25 -w 1 -r 3 -an] terminé par 0
Mechkov
@Mechkov - Terminer avec un 0 signifie une sortie réussie. Pouvez-vous exécuter le script avec succès sans node-windows?
Corey
40

J'ai trouvé la chose si utile que j'ai construit un wrapper encore plus facile à utiliser ( npm , github ).

L'installer:

npm install -g qckwinsvc

Installation de votre service:

qckwinsvc

prompt: Service name: [name for your service]
prompt: Service description: [description for it]
prompt: Node script path: [path of your node script]
Service installed

Désinstaller votre service:

qckwinsvc --uninstall

prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
Hariram Nandagopal
la source
Merci, très facile !! quarky, ça marche pour moi (win 10 64 bit)
Furkan
«Npm ERR! asyncWrite n'est pas une fonction »« npm ERR! pna.nextTick n'est pas une fonction »
Timwi
Merci, c'est très facile à utiliser.
Enrique Flores
27

WinSer est un wrapper convivial node.js autour du populaire NSSM (Non-Sucking Service Manager)

Predrag Stojadinović
la source
n'aime pas NSSM car il suppose qu'il est non-suceur car il gère le plantage de l'application hébergée, donc en fait, c'est l'application hébergée qui suce. Je n'aime pas en général blâmer Microsoft simplement parce que c'est Microsoft.
Felice Pollano
2
@FelicePollano NSSM suppose qu'il est non-suceur car il surveille l'application hébergée, contrairement à d'autres solutions comme srvany qui laissent le service dans un état en cours d'exécution, même si le processus encapsulé meurt.
Jürgen Steinblock
@ JürgenSteinblock c'est exactement ce que j'ai dit: l'application hébergée est-elle suceuse, pas le gestionnaire de service lui
Felice Pollano
2
@FelicePollano une sortie d'application hébergée ne signifie pas nécessairement quelque chose de mauvais. Le point est le suivant: NSSM reflète (ou peut refléter s'il est configuré correctement) l'état réel du service afin que le service puisse être surveillé au lieu de simplement supposer un état de fonctionnement comme les autres gestionnaires de services (en tant qu'utilisateur, je peux tuer le processus hébergé et srvary le montrerait toujours le service en état de fonctionnement).
Jürgen Steinblock
16

De ce blog

Ensuite, je voulais héberger le nœud en tant que service, tout comme IIS. De cette façon, il démarre avec ma machine, s'exécute en arrière-plan, redémarre automatiquement en cas de panne, etc.

C'est là que nssm , le gestionnaire de services non-suceur, entre en scène. Cet outil vous permet d'héberger un .exe normal en tant que service Windows.

Voici les commandes que j'ai utilisées pour configurer une instance de l'application de votre nœud en tant que service, ouvrez votre cmd comme administrateur et tapez les commandes suivantes:

nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js
net start service_name
Michael Horojanski
la source
14

Je ne réponds pas directement à la question, mais je propose une alternative qui pourrait également répondre à vos besoins d'une manière plus node.js.

Fonctionnellement, les exigences sont:

  1. Faire fonctionner la logique (application) en arrière-plan
  2. Être capable de démarrer / arrêter la logique
  3. Démarrez automatiquement la logique au démarrage du système

Ces exigences peuvent être satisfaites en utilisant un gestionnaire de processus (PM) et en faisant démarrer le gestionnaire de processus au démarrage du système. Deux bons PM compatibles avec Windows sont:

Pour que le PM démarre automatiquement, le moyen le plus simple est de créer une tâche planifiée avec un déclencheur «Au démarrage»:

entrez la description de l'image ici

KFL
la source
Si vous essayez de commencer à pm2utiliser un script batch au démarrage, assurez-vous d'inclure les variables d'environnement sinon cela ne fonctionnera pas. Discuté ici: github.com/Unitech/pm2/issues/1079
steampowered
@steampowered comment donner le chemin PM2_Home?
charan tej
0

L' approche gestionnaire de processus + planificateur de tâches que j'ai publiée il y a un an fonctionne bien avec certaines installations de service ponctuelles. Mais récemment, j'ai commencé à concevoir un système sous la forme d'un micro-service, avec de nombreux petits services qui se parlent via IPC. Donc, configurer manuellement chaque service est devenu insupportable.

Dans le but d'installer des services sans configuration manuelle, j'ai créé serman , un outil en ligne de commande (installer avec npm i -g serman) pour installer un exécutable en tant que service. Tout ce dont vous avez besoin pour écrire (et n'écrire qu'une seule fois) est un simple fichier de configuration de service avec votre exécutable. Courir

serman install <path_to_config_file>

installera le service. stdoutet stderrsont tous enregistrés. Pour plus d'informations, consultez le site Web du projet .

Un fichier de configuration fonctionnel est très simple, comme illustré ci-dessous. Mais il possède également de nombreuses fonctionnalités utiles telles que <env>et <persistent_env>ci - dessous.

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable machine-wide.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
KFL
la source