Perpustakaan ini dapat digunakan untuk menginstal/memulai/menghentikan/menghapus instalan skrip simpul sebagai layanan latar belakang Windows untuk lingkungan produksi . Ini bukan alat untuk mengembangkan aplikasi, ini adalah alat untuk melepaskannya. Alat ini menghasilkan executable yang akan menjalankan aplikasi Anda dengan versi Node.js apa pun yang diinstal di komputer.
Lihat Node-Mac dan Node-Linux Jika Anda perlu mendukung sistem operasi tersebut.
Tweet saya (@goldglovecb) jika Anda membutuhkan saya.
![]() | ![]() | ![]() | ![]() |
Tidak bisa mensponsori? Pertimbangkan menominasikan @coreybutler untuk bintang github. | |||
Fitur-fitur berikut tersedia di node-windows:
exec sebagai sudoer.Cara yang disarankan untuk menginstal node-windows adalah dengan NPM, menggunakan bendera global:
npm install -g node-windows
Kemudian, di root proyek Anda, jalankan:
npm link node-windows
Namun; Dimungkinkan untuk menggunakan node-windows tanpa bendera global (yaitu menginstal langsung ke root proyek). Rincian lebih lanjut tentang mengapa ini bukan pendekatan yang disarankan tersedia di seluruh readme ini.
Menggunakan modul node asli pada windows dapat mengisap. Sebagian besar modul asli tidak didistribusikan dalam format biner. Sebaliknya, modul-modul ini bergantung pada npm untuk membangun proyek, memanfaatkan Node-Gyp. Ini berarti pengembang perlu menginstal Visual Studio (dan berpotensi lain) di sistem, hanya untuk menginstal modul asli. Ini portabel, tetapi menyakitkan ... terutama karena Visual Studio itu sendiri lebih dari 2GB.
Node-windows tidak menggunakan modul asli. Ada beberapa utilitas biner/exe, tetapi segala sesuatu yang dibutuhkan untuk menjalankan tugas yang lebih kompleks dikemas dan didistribusikan dalam format yang mudah digunakan. Jadi, tidak perlu untuk Visual Studio ... setidaknya tidak untuk modul ini.
Node-Windows memiliki utilitas untuk menjalankan skrip Node.js sebagai Windows Services. Harap dicatat bahwa seperti semua layanan Windows, membuat satu membutuhkan hak istimewa administratif. Untuk membuat layanan dengan node-windows, siapkan skrip seperti:
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' ,
nodeOptions : [
'--harmony' ,
'--max_old_space_size=4096'
]
//, workingDirectory: '...'
//, allowServiceLogon: true
} ) ;
// Listen for the "install" event, which indicates the
// process is available as a service.
svc . on ( 'install' , function ( ) {
svc . start ( ) ;
} ) ;
svc . install ( ) ; Kode di atas membuat objek Service baru, memberikan nama dan deskripsi yang cantik. Atribut script mengidentifikasi skrip node.js yang harus dijalankan sebagai layanan. Setelah menjalankan ini, skrip akan terlihat dari utilitas Windows Services.
Objek Service memancarkan acara berikut:
Dalam contoh di atas, skrip mendengarkan acara install . Karena acara ini dipecat ketika instalasi layanan selesai, aman untuk memulai layanan.
Layanan yang dibuat oleh node-windows mirip dengan kebanyakan layanan lain yang berjalan di Windows. Mereka dapat dimulai/dihentikan dari utilitas layanan Windows, melalui perintah NET START atau NET STOP , atau bahkan dikelola menggunakan utilitas SC.
Mungkin diinginkan untuk menentukan sakelar baris perintah ke skrip Anda. Anda dapat melakukan ini dengan mengatur scriptOptions dalam konfigurasi layanan:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
scriptOptions : '-c C:\path\to\somewhere\special -i'
} ) ;Terkadang Anda mungkin ingin memberikan layanan dengan data statis, disahkan pada pembuatan layanan. Anda dapat melakukan ini dengan mengatur variabel lingkungan dalam konfigurasi layanan, seperti yang ditunjukkan di bawah ini:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
}
} ) ;Anda juga dapat menyediakan array untuk mengatur beberapa variabel lingkungan:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
env : [ {
name : "HOME" ,
value : process . env [ "USERPROFILE" ] // service is now able to access the user who created its' home directory
} ,
{
name : "TEMP" ,
value : path . join ( process . env [ "USERPROFILE" ] , "/temp" ) // use a temp directory in user's home directory
} ]
} ) ; Ada saat -saat ketika Anda mungkin ingin menentukan node tertentu yang dapat digunakan untuk menjalankan skrip Anda. Anda dapat melakukan ini dengan mengatur execPath di konfigurasi layanan, seperti yang ditunjukkan di bawah ini:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
execPath : 'C:\path\to\specific\node.exe'
} ) ;Jika Anda perlu menentukan pengguna tertentu atau kredensial tertentu untuk mengelola layanan, atribut berikut mungkin bermanfaat.
Atribut user adalah objek dengan tiga tombol: domain , account , dan password . Ini dapat digunakan untuk mengidentifikasi pengguna mana yang harus digunakan pustaka layanan untuk melakukan perintah sistem. Secara default, domain diatur ke nama komputer lokal, tetapi dapat ditimpa dengan domain Active Directory atau LDAP. Misalnya:
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' ) ,
//, allowServiceLogon: true
} ) ;
svc . logOnAs . domain = 'mydomain.local' ;
svc . logOnAs . account = 'username' ;
svc . logOnAs . password = 'password' ;
... Baik akun dan kata sandi harus didefinisikan secara eksplisit jika Anda ingin modul layanan menjalankan perintah sebagai pengguna tertentu. Secara default, ini akan berjalan menggunakan akun pengguna yang meluncurkan proses (yaitu siapa yang meluncurkan node app.js ).
Jika Anda ingin menginstruksikan WinSW untuk mengizinkan login Akun Layanan, tentukan allowServiceLogon: true . Ini dinonaktifkan secara default karena beberapa pengguna telah mengalami masalah menjalankan ini tanpa logon layanan.
Atribut lainnya adalah sudo . Atribut ini memiliki satu properti yang disebut password . Dengan menyediakan ini, modul layanan akan mencoba menjalankan perintah menggunakan akun pengguna yang meluncurkan proses dan kata sandi untuk akun itu. Ini hanya boleh digunakan untuk akun dengan hak administratif.
app.js
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
svc . sudo . password = 'password' ;
...Layanan ini juga dapat dibuat tergantung pada layanan Windows lainnya.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
dependsOn : [ "serviceA" ]
} ) ;Menghapus pemasangan layanan yang dibuat sebelumnya secara sintaksis mirip dengan instalasi.
var Service = require ( 'node-windows' ) . Service ;
// Create a new service object
var svc = new Service ( {
name : 'Hello World' ,
script : require ( 'path' ) . join ( __dirname , 'helloworld.js' )
} ) ;
// Listen for the "uninstall" event so we know when it's done.
svc . on ( 'uninstall' , function ( ) {
console . log ( 'Uninstall complete.' ) ;
console . log ( 'The service exists: ' , svc . exists ) ;
} ) ;
// Uninstall the service.
svc . uninstall ( ) ;Proses uninstall hanya menghapus file spesifik proses. Itu tidak menghapus skrip node.js Anda!
Banyak hal!
Proses & Pemantauan yang Menjalankan Lama:
Pemulihan layanan bawaan untuk layanan Windows cukup terbatas dan tidak dapat dengan mudah dikonfigurasi dari kode. Oleh karena itu, node-windows membuat pembungkus di sekitar skrip Node.js. Pembungkus ini bertanggung jawab untuk memulai kembali layanan yang gagal dengan cara yang cerdas dan dapat dikonfigurasi. Misalnya, jika skrip Anda macet karena kesalahan yang tidak diketahui, node-windows akan mencoba untuk memulai kembali. Secara default, ini terjadi setiap detik. Namun; Jika skrip memiliki cacat fatal yang membuatnya macet berulang kali, itu menambah overhead yang tidak perlu ke sistem. Node-windows menangani ini dengan meningkatkan interval waktu antara restart dan menutup jumlah maksimum restart.
Restart lebih pintar yang tidak akan memukul server Anda:
Menggunakan pengaturan default, node-windows menambahkan 25% ke interval tunggu setiap kali perlu memulai kembali skrip. Dengan pengaturan default (1 detik), upaya restart pertama terjadi setelah satu detik. Yang kedua terjadi setelah 1,25 detik. Yang ketiga setelah 1,56 detik (1,25 meningkat 25%) dan seterusnya. Baik waktu tunggu awal dan laju pertumbuhan adalah opsi konfigurasi yang dapat diteruskan ke Service baru. Misalnya:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
wait : 2 ,
grow : .5
} ) ;Dalam contoh ini, periode tunggu akan dimulai pada 2 detik dan meningkat sebesar 50%. Jadi, upaya kedua adalah 3 detik kemudian sedangkan yang keempat adalah 4,5 detik kemudian.
Jangan Dos Diri Sendiri!
Daur ulang yang berulang berpotensi bisa berlangsung selamanya dengan naskah yang buruk. Untuk menangani situasi ini, node-windows mendukung dua jenis topi. Menggunakan maxRetries akan menutup jumlah maksimum upaya restart. Secara default, ini tidak terbatas. Menetapkannya ke 3 akan memberi tahu proses untuk tidak lagi memulai kembali suatu proses setelah gagal 3 kali. Pilihan lain adalah maxRestarts , yang membatasi jumlah restart yang dicoba dalam 60 detik. Misalnya, jika ini diatur ke 3 (default) dan proses crash/restart berulang kali, node-windows akan menghentikan upaya restart setelah siklus ke-3 di jendela 60 detik. Kedua opsi konfigurasi ini dapat diatur, seperti wait atau grow .
Akhirnya, atribut yang disebut abortOnError dapat diatur ke true jika Anda ingin skrip Anda tidak restart sama sekali saat keluar dengan kesalahan.
Node-Windows menggunakan utilitas WinSW untuk membuat .exe unik untuk setiap skrip node.js yang digunakan sebagai layanan. Direktori yang disebut daemon dibuat dan diisi dengan myappname.exe dan myappname.xml . File XML adalah konfigurasi untuk executable. Selain itu, winsw akan membuat beberapa log untuk dirinya sendiri di direktori ini (yang dapat dilihat dalam log acara).
File myappname.exe meluncurkan pembungkus node-windows, yang bertanggung jawab untuk memantau dan mengelola skrip. Karena file ini adalah bagian dari node-windows, memindahkan direktori node-windows dapat menghasilkan file .exe yang tidak dapat menemukan skrip node.js. Namun; Ini seharusnya tidak menjadi masalah jika node-windows diinstal secara global, sesuai instruksi instalasi yang disarankan.
Semua file khusus daemon ini dibuat dalam subdirektori yang disebut daemon , yang dibuat di direktori yang sama di mana skrip node.js disimpan. Menghapus pemasangan layanan akan menghapus file -file ini.
Pencatatan acara
Layanan yang dibuat dengan node-windows memiliki dua log acara yang dapat dilihat melalui Windows Event Viewer. Sumber log bernama myappname.exe menyediakan pencatatan dasar untuk file yang dapat dieksekusi. Ini dapat digunakan untuk melihat kapan seluruh layanan dimulai/berhenti atau memiliki kesalahan. Log kedua, dinamai nama layanan Anda (yaitu nama aplikasi saya), digunakan oleh monitor node-windows. Dimungkinkan untuk menulis ke log ini dari skrip Node.js menggunakan penebangan acara Node-Windows.
Baru pada v0.1.0 adalah utilitas logging acara non-C ++ . Utilitas ini dapat menulis ke log acara, membuat log Anda terlihat dari penampil acara. Ini menggunakan EventCreate di bawah kap.
Untuk membuat logger:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( 'Hello World' ) ;
log . info ( 'Basic information.' ) ;
log . warn ( 'Watch out!' ) ;
log . error ( 'Something went wrong.' ) ;Terlihat mirip dengan:
Beberapa opsi yang kurang digunakan juga tersedia melalui pencatatan acara Node-Windows.
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ; Setiap jenis log (info, peringatan, kesalahan, auditsuccess, dan auditfailure) secara opsional menerima dua argumen tambahan, termasuk kode dan panggilan balik . Secara default, kode acara adalah 1000 jika tidak ditentukan. Untuk memberikan kode acara khusus dengan pesan log dan tulis pesan itu ke konsol, kode berikut dapat digunakan:
PEMBERITAHUAN: Tampaknya EventCreate hanya mendukung ID khusus <= 1000.
log . info ( 'Something different happened!' , 700 , function ( ) {
console . log ( 'Something different happened!' ) ;
} ) ; Secara default, log acara adalah bagian dari ruang lingkup APPLICATION . Namun; Dimungkinkan juga untuk menggunakan log SYSTEM . Untuk melakukan ini, objek konfigurasi harus diteruskan ke log baru:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( {
source : 'My Event Log' ,
eventLog : 'SYSTEM'
} ) ;Log acara peringatan yang diproduksi oleh pembungkus dapat ditekan dengan menonaktifkannya saat membuat layanan. Log peringatan diaktifkan secara default.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
disableWarningLogs : true ,
} ) ;Node-windows mengirim dengan beberapa perintah untuk menyederhanakan tugas pada MS Windows.
Tinggikan mirip dengan sudo di Linux/Mac. Ia berusaha untuk meningkatkan hak istimewa pengguna saat ini ke administrator lokal. Menggunakan ini tidak memerlukan kata sandi, tetapi memang mengharuskan pengguna saat ini memiliki hak administratif. Tanpa hak istimewa ini, perintah akan gagal dengan kesalahan access denied .
Pada sistem dengan UAC diaktifkan, ini dapat meminta izin pengguna untuk melanjutkan:
Sintaks :
elevate(cmd[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . Sudo bertindak mirip dengan sudo di Linux/Mac. Tidak seperti Elevate , itu membutuhkan kata sandi, tetapi tidak akan meminta izin pengguna untuk melanjutkan. Seperti mengangkat , ini masih membutuhkan hak administratif untuk pengguna, jika tidak perintah akan gagal. Perbedaan utama antara ini dan peningkatan () adalah prompt.
Sintaks :
sudo(cmd,password[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . Perintah asinkron ini menentukan apakah pengguna saat ini memiliki hak administratif. Ini memberikan nilai boolean ke panggilan balik, mengembalikan true jika pengguna adalah administrator atau false jika tidak.
Contoh
var wincmd = require ( 'node-windows' ) ;
wincmd . isAdminUser ( function ( isAdmin ) {
if ( isAdmin ) {
console . log ( 'The user has administrative privileges.' ) ;
} else {
console . log ( 'NOT AN ADMIN' ) ;
}
} ) ; Metode daftar menanyakan sistem operasi untuk daftar proses berjalan.
var wincmd = require ( 'node-windows' ) ;
wincmd . list ( function ( svc ) {
console . log ( svc ) ;
} , true ) ; Ini mengembalikan berbagai proses berjalan. Menyediakan argumen true opsional dalam contoh di atas memberikan daftar dengan output verbose. Output khusus untuk versi sistem operasi. Berikut adalah contoh output verbose pada komputer Windows 8.
[ {
ImageName : 'cmd.exe' ,
PID : '12440' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '1,736 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} , {
ImageName : 'tasklist.exe' ,
PID : '1652' ,
SessionName : 'Console' ,
'Session#' : '1' ,
MemUsage : '8,456 K' ,
Status : 'Unknown' ,
UserName : 'Machine\Corey' ,
CPUTime : '0:00:00' ,
WindowTitle : 'N/A'
} ] Output reguler (non-Verbose) biasanya menyediakan ImageName , PID , SessionName , Session# , MemUsage , dan CPUTime .
Metode ini akan membunuh proses oleh PID .
var wincmd = require ( 'node-windows' ) ;
wincmd . kill ( 12345 , function ( ) {
console . log ( 'Process Killed' ) ;
} ) ; Dalam contoh ini, proses ID 12345 akan dibunuh. Penting untuk dicatat bahwa akun pengguna yang menjalankan skrip node ini mungkin memerlukan hak administratif.
Jika Anda mengalami masalah dengan contoh, silakan tinjau file TESTS.md .
Jika Anda menemukan acara InvalidInstallation , lihat direktori daemon yang dibuat selama instalasi untuk memastikan file .exe dan .xml ada di sana. Dalam beberapa keadaan, terutama selama _un_installation, adalah kemungkinan proses untuk sementara mengunci file log, yang mencegah windows menghapusnya. Dalam skenario ini, cukup jalankan uninstall lagi. Dalam kebanyakan kasus ini akan memperbaiki masalah ini. Jika tidak, lepaskan direktori daemon secara manual sebelum menjalankan instalasi lagi.
Ada banyak kontributor yang telah melakukan segalanya, mulai dari fitur komitmen hingga membantu mengambil Slack saat saya telah dibanjiri. Saya sangat menghargai bantuannya.
Terima kasih khusus kepada @Arthurblake yang modifikasi akhirnya telah ditambahkan. Terima kasih kepada @HockeyTim11, yang membantu menyusun dan memperbarui banyak masalah luar biasa dan mulai membawa dukungan ke perpustakaan node-* lainnya.
Winsw dan Sudowin adalah hak cipta dari pemiliknya masing -masing. WinSW didistribusikan di bawah lisensi MIT. Sudowin didistribusikan di bawah lisensi BSD.
Semua skrip lainnya adalah hak cipta (c) Corey Butler di bawah lisensi MIT.
(Lisensi MIT)
Hak Cipta (C) 2013 Corey Butler
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan 'sebagaimana adanya', tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.