Pobrałem node.js wykonywalny. Jak mogę uruchomić ten plik wykonywalny jako usługę systemu Windows? Nie mogę użyć standardowego instalatora node.js, ponieważ muszę jednocześnie uruchomić wiele wersji node.js.
Odpowiedzi:
Spóźniony na przyjęcie, ale okna węzłów też się sprawdzą.
Posiada również wbudowane logowanie systemowe.
Istnieje API do tworzenia skryptów z kodu, tj
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: Jestem autorem tego modułu.
Wydało mi się to tak przydatne, że zbudowałem wokół niego jeszcze łatwiejszy w użyciu wrapper ( npm , github ).
Instalowanie:
npm install -g qckwinsvc
Instalowanie usługi:
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
Odinstalowywanie usługi:
qckwinsvc --uninstall
prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
WinSer jest przyjaznym dla node.js opakowaniem wokół popularnego NSSM (Non-Sucking Service Manager)
Następnie chciałem hostować węzeł jako usługę, podobnie jak IIS. W ten sposób uruchamia się z moim komputerem, działa w tle, uruchamia się ponownie automatycznie w przypadku awarii i tak dalej.
W tym miejscu pojawia się nssm , niezasysający menedżer usług. To narzędzie umożliwia hostowanie zwykłego pliku .exe jako usługi systemu Windows.
Oto polecenia, których użyłem, aby skonfigurować wystąpienie aplikacji twojego węzła jako usługę, otwórz cmd like administrator i wpisz następujące polecenia:
nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js net start service_name
Nie odpowiadam na to pytanie bezpośrednio, ale zapewniam alternatywę, która może również spełnić Twoje wymagania w sposób bardziej node.js.
Wymagania funkcjonalne to:
Wymagania te można spełnić, korzystając z menedżera procesów (PM) i uruchamiając menedżera procesów podczas uruchamiania systemu. Dwóch dobrych menedżerów przyjaznych dla systemu Windows to:
Aby PM uruchamiał się automatycznie, najprostszym sposobem jest utworzenie zaplanowanego zadania z wyzwalaczem „Przy uruchomieniu”:
pm2
korzystanie ze skryptu wsadowego podczas uruchamiania, pamiętaj o dołączeniu zmiennych środowiskowych, w przeciwnym razie nie zadziała. Omówiono tutaj: github.com/Unitech/pm2/issues/1079
Podejście do menedżera procesów i harmonogramu zadań, które opublikowałem rok temu, działa dobrze w przypadku niektórych jednorazowych instalacji usług. Ale ostatnio zacząłem projektować system w sposób mikro-usługowy, z wieloma małymi usługami rozmawiającymi ze sobą za pośrednictwem IPC. Dlatego ręczne konfigurowanie każdej usługi stało się nie do zniesienia.
Mając na celu instalowanie usług bez ręcznej konfiguracji, stworzyłem serman , narzędzie wiersza poleceń (zainstaluj za pomocą npm i -g serman
), aby zainstalować plik wykonywalny jako usługę. Wszystko, co musisz napisać (i tylko raz), to prosty plik konfiguracyjny usługi wraz z plikiem wykonywalnym. Biegać
serman install <path_to_config_file>
zainstaluje usługę. stdout
i stderr
wszystkie są rejestrowane. Aby uzyskać więcej informacji, odwiedź witrynę internetową projektu .
Działający plik konfiguracyjny jest bardzo prosty, jak pokazano poniżej. Ale ma też wiele przydatnych funkcji, takich jak <env>
i <persistent_env>
poniżej.
<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>