จะติดตั้ง node.js เป็นบริการ windows ได้อย่างไร?


130

ฉันดาวน์โหลดไฟล์ปฏิบัติการnode.jsแล้ว ฉันจะเรียกใช้ไฟล์ปฏิบัติการนั้นเป็นบริการ Windows ได้อย่างไร ฉันไม่สามารถใช้โปรแกรมติดตั้ง node.js มาตรฐานได้เนื่องจากฉันต้องรัน node.js หลายเวอร์ชันพร้อมกัน

คำตอบ:


187

สายไปงานปาร์ตี้ แต่node-windowsก็ทำเคล็ดลับเช่นกัน

ป้อนคำอธิบายภาพที่นี่

นอกจากนี้ยังมีการบันทึกระบบในตัว

ป้อนคำอธิบายภาพที่นี่

มี API สำหรับสร้างสคริปต์จากโค้ดเช่น

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: ฉันเป็นผู้เขียนโมดูลนี้


3
วินาทีที่ "น่ากลัว" ฉันเพิ่งทำตามคำแนะนำของ readme ของคุณและมันได้ผลทันที - หายากมาก! เพียงสิ่งเดียวที่คุณอาจต้องการเพิ่มใน readme: วิธีเรียกใช้สคริปต์ js ที่สร้างขึ้นที่ CLI: ie> node set_up_win_service.js ...
mike หนู

@Corey ฉันสามารถเรียกใช้แพ็คเกจJXCoreเป็นบริการโดยใช้โมดูลนี้ได้อย่างไร
Madhur

@ Madhur - ในทางทฤษฎีมันอาจได้ผล แต่ฉันยังไม่ได้และไม่ได้วางแผนที่จะทดสอบ node-windows ใช้ไฟล์ wrapper.js ที่รับผิดชอบในการมอนิเตอร์ / รีสตาร์ท สิ่งนี้เพิ่งเปิดสคริปต์โหนดเป็นกระบวนการลูก นอกจากนี้ยังสามารถกำหนดค่าพา ธ ที่เรียกใช้งานได้ (เช่น jx แทนโหนด) ในทางทฤษฎีคุณอาจจะทำได้ แต่ฉันไม่รู้ว่าคุณอาจเจอนิสัยใจคอแบบไหน
Corey

@Corey ฉันมีแอป Http Node ที่เรียบง่าย แต่ดูเหมือนจะใช้บริการนี้ไม่ได้ ติดตั้งและเริ่มต้นได้ดี แต่หยุดทันที ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมากครับ! โปรแกรมดูเหตุการณ์ไม่แสดงข้อผิดพลาด แต่คำเตือน: กระบวนการลูก [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] สิ้นสุดด้วย 0
Mechkov

@Mechkov - การยุติด้วย 0 หมายถึงทางออกที่ประสบความสำเร็จ คุณสามารถรันสคริปต์ได้สำเร็จโดยไม่ใช้ node-windows หรือไม่?
Corey

40

ฉันพบว่าสิ่งนี้มีประโยชน์มากจนฉันสร้าง wrapper ที่ใช้งานง่ายกว่าเดิม ( npm , github )

การติดตั้ง:

npm install -g qckwinsvc

การติดตั้งบริการของคุณ:

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

การถอนการติดตั้งบริการของคุณ:

qckwinsvc - ถอนการติดตั้ง

prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled

ขอบคุณง่ายมาก !! Quarky มันใช้ได้กับฉัน (ชนะ 10 64 บิต)
Furkan

“ npm ผิดพลาด! asyncWrite ไม่ใช่ฟังก์ชัน”“ npm ERR! pna.nextTick ไม่ใช่ฟังก์ชัน”
Timwi

ขอบคุณนี่ใช้งานง่ายมาก
Enrique Flores

27

WinSerเป็นเสื้อคลุมที่เป็นมิตรกับ node.js รอบ ๆNSSM (Non-Sucking Service Manager)


ไม่ชอบ NSSM เพราะถือว่าเป็น Non-Sucking เนื่องจากจัดการกับข้อขัดข้องของแอปพลิเคชันที่โฮสต์ดังนั้นจึงเป็นการดูดแอปพลิเคชันที่โฮสต์ไว้ ไม่ชอบการตำหนิโดยทั่วไปที่ Microsoft เพียงเพราะเป็น Microsoft
Felice Pollano

2
@FelicePollano NSSM ถือว่าไม่ใช่การดูดเนื่องจากตรวจสอบแอปพลิเคชันที่โฮสต์ซึ่งตรงกันข้ามกับโซลูชันอื่น ๆ เช่น srvany ที่ปล่อยให้บริการอยู่ในสถานะทำงานแม้ว่ากระบวนการที่ห่อไว้จะตาย
Jürgen Steinblock

@ JürgenSteinblockนี่คือสิ่งที่ฉันพูด: แอปพลิเคชั่นที่โฮสต์กำลังดูดไม่ใช่ผู้จัดการบริการเอง
Felice Pollano

2
@FelicePollano การออกจากแอปพลิเคชันที่โฮสต์ไม่ได้หมายความว่าสิ่งที่ไม่ดี ประเด็นคือ: NSSM สะท้อน (หรือสามารถสะท้อนว่ากำหนดค่าอย่างถูกต้อง) สถานะของบริการจริงเพื่อให้สามารถตรวจสอบบริการได้แทนที่จะสมมติว่าสถานะกำลังทำงานเหมือนผู้จัดการบริการอื่น ๆ (ในฐานะผู้ใช้ฉัน kann ฆ่ากระบวนการที่โฮสต์และ srvary จะยังคงแสดง บริการอยู่ในสถานะทำงาน)
Jürgen Steinblock

16

จากบล็อกนี้

ถัดไปฉันต้องการโฮสต์โหนดเป็นบริการเช่นเดียวกับ IIS วิธีนี้จะเริ่มต้นด้วยเครื่องของฉันทำงานในพื้นหลังรีสตาร์ทโดยอัตโนมัติหากเกิดปัญหาและอื่น ๆ

นี่คือที่ที่nssmตัวจัดการบริการที่ไม่ดูดเข้ามาในรูปภาพ เครื่องมือนี้ให้คุณโฮสต์. exe ปกติเป็นบริการ Windows

นี่คือคำสั่งที่ฉันใช้ในการตั้งค่าอินสแตนซ์ของแอปพลิเคชันโหนดของคุณเป็นบริการเปิด cmd ของคุณเช่นผู้ดูแลระบบและพิมพ์คำสั่งต่อไปนี้:

nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js
net start service_name

14

ฉันไม่ได้ตอบคำถามโดยตรง แต่ให้ทางเลือกอื่นที่อาจตรงตามความต้องการของคุณในรูปแบบแฟชั่น node.js เพิ่มเติม

ความต้องการตามหน้าที่คือ:

  1. ให้ตรรกะ (แอป) ทำงานอยู่เบื้องหลัง
  2. สามารถเริ่ม / หยุดตรรกะได้
  3. เริ่มตรรกะโดยอัตโนมัติเมื่อระบบบูทขึ้น

ข้อกำหนดเหล่านี้สามารถตอบสนองได้โดยใช้ตัวจัดการกระบวนการ (PM) และทำให้ตัวจัดการกระบวนการเริ่มต้นเมื่อเริ่มต้นระบบ PM ที่ดีสองรายการที่เหมาะกับ Windows ได้แก่ :

ในการทำให้ PM เริ่มโดยอัตโนมัติวิธีที่ง่ายที่สุดคือสร้างงานตามกำหนดเวลาโดยใช้ทริกเกอร์ "At Startup":

ป้อนคำอธิบายภาพที่นี่


หากคุณพยายามเริ่มต้นpm2ใช้สคริปต์แบตช์ในการเริ่มต้นตรวจสอบให้แน่ใจว่าได้รวมตัวแปรสภาพแวดล้อมไม่เช่นนั้นจะไม่ทำงาน
พูดคุย

@steampowered ให้เส้นทาง PM2_Home อย่างไร?
charan tej

0

วิธีจัดการกระบวนการ + ตัวกำหนดตารางเวลางานที่ฉันโพสต์เมื่อปีที่แล้วทำงานได้ดีกับการติดตั้งบริการแบบครั้งเดียว แต่เมื่อไม่นานมานี้ฉันเริ่มออกแบบระบบในรูปแบบไมโครเซอร์วิสโดยมีบริการเล็ก ๆ มากมายที่พูดคุยกันผ่าน IPC ดังนั้นการกำหนดค่าแต่ละบริการด้วยตนเองจึงไม่สามารถทนทานได้

เพื่อเป้าหมายในการติดตั้งบริการโดยไม่ต้องกำหนดค่าด้วยตนเองฉันได้สร้างsermanซึ่งเป็นเครื่องมือบรรทัดคำสั่ง (ติดตั้งด้วยnpm i -g serman) เพื่อติดตั้งไฟล์ปฏิบัติการเป็นบริการ สิ่งที่คุณต้องเขียน (และเขียนเพียงครั้งเดียว) คือไฟล์การกำหนดค่าบริการที่เรียบง่ายพร้อมกับปฏิบัติการของคุณ วิ่ง

serman install <path_to_config_file>

จะติดตั้งบริการ stdoutและstderrเข้าสู่ระบบทั้งหมด สำหรับข้อมูลเพิ่มเติมโปรดดูที่การเว็บไซต์โครงการ

ไฟล์กำหนดค่าที่ใช้งานได้นั้นง่ายมากดังที่แสดงด้านล่าง แต่ยังมีคุณสมบัติที่มีประโยชน์มากมายเช่น<env>และ<persistent_env>ด้านล่าง

<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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.