يمكن استخدام هذه المكتبة لتثبيت/بدء/إيقاف/إلغاء تثبيت البرامج النصية لعقدة كخدمات خلفية Windows لبيئات الإنتاج . هذه ليست أداة لتطوير التطبيقات ، فهي أداة لإصدارها. تقوم هذه الأداة بإنشاء قابلة للتنفيذ ستقوم بتشغيل تطبيقك مع أي إصدار من Node.js مثبت على الكمبيوتر.
راجع Node-MAC و Node-Linux إذا كنت بحاجة إلى دعم أنظمة التشغيل هذه.
سقسقة لي (goldglovecb) إذا كنت بحاجة لي.
![]() | ![]() | ![]() | ![]() |
لا تستطيع الرعاية؟ النظر في ترشيح coreybutler لنجم جيثب. | |||
تتوفر الميزات التالية في Windows Node:
exec كصاحب.الطريقة الموصى بها لتثبيت نوافد العقدة هي مع NPM ، باستخدام العلم العالمي:
npm install -g node-windows
ثم ، في جذر مشروعك ، قم بتشغيل:
npm link node-windows
لكن؛ من الممكن استخدام نوافذ العقدة بدون العلم العالمي (أي تثبيت مباشرة في جذر المشروع). مزيد من التفاصيل حول سبب عدم توفر هذا النهج الموصى به خلال هذا ReadMe.
يمكن أن تمتص استخدام وحدات العقدة الأصلية على Windows. لا يتم توزيع معظم الوحدات الأصلية بتنسيق ثنائي. بدلاً من ذلك ، تعتمد هذه الوحدات على npm لبناء المشروع ، باستخدام GYP Node. هذا يعني أن المطورين بحاجة إلى تثبيت Visual Studio (وربما البرامج الأخرى) على النظام ، فقط لتثبيت وحدة أصلية. هذا محمول ، لكنه مؤلم ... في الغالب لأن Visual Studio نفسه يزيد عن 2 جيجابايت.
لا تستخدم Windows العقدة الوحدات النمطية الأصلية. هناك بعض المرافق الثنائية/EXE ، ولكن كل ما يحتاجه لتشغيل مهام أكثر تعقيدًا يتم تعبئته وتوزيعه بتنسيق قابل للاستخدام بسهولة. لذلك ، لا حاجة إلى Visual Studio ... على الأقل ليس لهذه الوحدة.
تمتلك Node-Windows أداة لتشغيل Node.js Scripts كخدمات Windows. يرجى ملاحظة أنه مثل جميع خدمات Windows ، فإن إنشاء واحدة يتطلب امتيازات إدارية. لإنشاء خدمة مع نوافد العقدة ، قم بإعداد برنامج نصي مثل:
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 ( ) ; يقوم الرمز أعلاه بإنشاء كائن Service جديد ، يوفر اسمًا ووصفًا جميلًا. تحدد سمة script البرنامج النصي node.js الذي يجب أن يتم تشغيله كخدمة. عند تشغيل هذا ، سيكون البرنامج النصي مرئيًا من أداة خدمات Windows.
ينبعث كائن Service الأحداث التالية:
في المثال أعلاه ، يستمع البرنامج النصي لحدث install . نظرًا لأن هذا الحدث يتم إطلاقه عند اكتمال تثبيت الخدمة ، فمن الآمن بدء الخدمة.
تشبه الخدمات التي تم إنشاؤها بواسطة Wod-Windows معظم الخدمات الأخرى التي تعمل على Windows. يمكن تشغيلها/إيقافها من الأداة المساعدة لخدمة Windows ، أو عبر أوامر NET START أو NET STOP ، أو حتى إدارتها باستخدام الأداة المساعدة SC.
قد يكون من المطلوب تحديد مفاتيح سطر الأوامر إلى البرنامج النصي الخاص بك. يمكنك القيام بذلك عن طريق تعيين scriptOptions داخل تكوين الخدمة:
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'
} ) ;في بعض الأحيان قد ترغب في تزويد خدمة ببيانات ثابتة ، تم تمريرها عند إنشاء الخدمة. يمكنك القيام بذلك عن طريق ضبط متغيرات البيئة في تكوين الخدمة ، كما هو موضح أدناه:
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
}
} ) ;يمكنك أيضًا توفير صفيف لوضع متغيرات بيئة متعددة:
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
} ]
} ) ; هناك أوقات قد ترغب فيها في تحديد node محددة قابلة للتنفيذ لاستخدامها لتشغيل البرنامج النصي الخاص بك. يمكنك القيام بذلك عن طريق تعيين execPath في تكوين الخدمة ، كما هو موضح أدناه:
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'
} ) ;إذا كنت بحاجة إلى تحديد مستخدم معين أو بيانات اعتماد معينة لإدارة الخدمة ، فقد تكون السمات التالية مفيدة.
سمة user هي كائن له ثلاثة مفاتيح: domain account وكلمة password . يمكن استخدام هذا لتحديد المستخدم الذي يجب أن تستخدمه مكتبة الخدمة لأداء أوامر النظام. بشكل افتراضي ، يتم تعيين المجال على اسم الكمبيوتر المحلي ، ولكن يمكن تجاوزه مع مجال Active Directory أو LDAP. على سبيل المثال:
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' ;
... يجب تحديد كل من الحساب وكلمة المرور بشكل صريح إذا كنت تريد تشغيل وحدة الخدمة كمستخدم معين. بشكل افتراضي ، سيتم تشغيله باستخدام حساب المستخدم الذي أطلق العملية (أي الذي أطلق node app.js ).
إذا كنت ترغب في تعليمات WINSW للسماح بتسجيل الدخول إلى حساب الخدمة ، فحدد allowServiceLogon: true . يتم تعطيل هذا افتراضيًا نظرًا لأن بعض المستخدمين واجهوا مشكلات في تشغيل هذا دون سجلات الخدمة.
السمة الأخرى هي sudo . تحتوي هذه السمة على خاصية واحدة تسمى password . من خلال توفير هذا ، ستحاول وحدة الخدمة تشغيل الأوامر باستخدام حساب المستخدم الذي أطلق العملية وكلمة المرور لهذا الحساب. يجب استخدام هذا فقط للحسابات ذات الامتيازات الإدارية.
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' ;
...يمكن أيضًا تقديم الخدمة اعتمادًا على خدمات Windows الأخرى.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
dependsOn : [ "serviceA" ]
} ) ;إن إلغاء تثبيت الخدمة التي تم إنشاؤها مسبقًا تشبه التثبيت.
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 ( ) ;تقوم عملية إلغاء التثبيت فقط بإزالة الملفات الخاصة بالعملية. لا يحذف البرنامج النصي node.js!
الكثير من الأشياء!
عمليات ومراقبة طويلة المدى:
استرداد الخدمة المدمج لخدمات Windows محدودة إلى حد ما ولا يمكن تكوينه بسهولة من التعليمات البرمجية. لذلك ، تنشئ Windows Node Windows غلافًا حول البرنامج النصي Node.js. هذا الغلاف مسؤول عن إعادة تشغيل خدمة فاشلة بطريقة ذكية وقابلة للتكوين. على سبيل المثال ، إذا تعطل البرنامج النصي بسبب خطأ غير معروف ، فسيحاول نوافد العقدة إعادة تشغيله. بشكل افتراضي ، يحدث هذا كل ثانية. لكن؛ إذا كان البرنامج النصي له عيب مميت يجعله يعطل مرارًا وتكرارًا ، فإنه يضيف النفقات العامة غير الضرورية إلى النظام. تعالج Node-Windows هذا عن طريق زيادة الفاصل الزمني بين إعادة التشغيل وتخصيص الحد الأقصى لعدد عمليات إعادة التشغيل.
إعادة تشغيل أكثر ذكاءً لن تضرب الخادم الخاص بك:
باستخدام الإعدادات الافتراضية ، يضيف Windows Node 25 ٪ إلى فاصل الانتظار في كل مرة يحتاج فيها إلى إعادة تشغيل البرنامج النصي. مع الإعداد الافتراضي (1 ثانية) ، تحدث محاولة إعادة التشغيل الأولى بعد ثانية واحدة. والثاني يحدث بعد 1.25 ثانية. الثالث بعد 1.56 ثانية (1.25 زاد بنسبة 25 ٪) وهلم جرا. كل من وقت الانتظار الأولي ومعدل النمو هما خيارات التكوين التي يمكن نقلها إلى Service جديدة. على سبيل المثال:
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
script : 'C:\path\to\helloworld.js' ,
wait : 2 ,
grow : .5
} ) ;في هذا المثال ، ستبدأ فترة الانتظار في ثانيتين وتزداد بنسبة 50 ٪. لذلك ، ستكون المحاولة الثانية بعد 3 ثوانٍ في حين أن الرابع سيكون بعد 4.5 ثانية.
لا تقلق نفسك!
يمكن أن تستمر إعادة التدوير المتكرر إلى الأبد مع نص سيء. للتعامل مع هذه المواقف ، تدعم نوافد العقدة نوعين من الأغطية. سيؤدي استخدام maxRetries إلى الحد الأقصى لعدد محاولات إعادة التشغيل. بشكل افتراضي ، هذا غير محدود. سيؤدي تعيينها إلى 3 إلى إخبار العملية بعدم إعادة تشغيل عملية بعد فشلها 3 مرات. هناك خيار آخر هو maxRestarts ، الذي يحصل على عدد عمليات إعادة التشغيل التي تمت محاولتها في غضون 60 ثانية. على سبيل المثال ، إذا تم تعيين ذلك على 3 (الافتراضي) وتعطل العملية/إعادة التشغيل بشكل متكرر ، فستتوقف النوافذ العقدة إلى إعادة تشغيل المحاولات بعد الدورة الثالثة في نافذة 60 ثانية. يمكن تعيين كل من خيارات التكوين هذه ، تمامًا مثل wait أو grow .
أخيرًا ، يمكن ضبط سمة تسمى abortOnError على true إذا كنت تريد عدم إعادة تشغيل البرنامج النصي الخاص بك على الإطلاق عندما يخرج بخطأ.
تستخدم Node-Windows الأداة المساعدة لـ WINSW لإنشاء .exe فريد لكل نص Node.js تم نشره كخدمة. يتم إنشاء دليل يسمى daemon وملوله باستخدام myappname.exe و myappname.xml . ملف XML هو تكوين للمنفذ. بالإضافة إلى ذلك ، ستقوم winsw بإنشاء بعض السجلات لنفسها في هذا الدليل (والتي يمكن عرضها في سجل الأحداث).
يقوم ملف myappname.exe بتشغيل Windows Windows ، وهو مسؤول عن مراقبة البرنامج النصي وإدارته. نظرًا لأن هذا الملف هو جزء من Windows Node ، فقد يؤدي نقل دليل Windows إلى عدم قدرة ملف .exe على العثور على نص Node.js. لكن؛ لا ينبغي أن تكون هذه مشكلة إذا تم تثبيت Windows العقدة على مستوى العالم ، وفقًا لإرشادات التثبيت الموصى بها.
يتم إنشاء كل هذه الملفات الخاصة بالخفيون في دليل فرعي يسمى daemon ، والذي يتم إنشاؤه في نفس الدليل حيث يتم حفظ البرنامج النصي Node.js. إلغاء تثبيت الخدمة سيؤدي إلى إزالة هذه الملفات.
تسجيل الحدث
تحتوي الخدمات التي تم إنشاؤها باستخدام Windows للعقدة على سجلان للأحداث يمكن عرضهما من خلال عارض الأحداث Windows. يوفر مصدر سجل يدعى myappname.exe تسجيلًا أساسيًا للملف القابل للتنفيذ. يمكن استخدامه لمعرفة متى تبدأ/توقف الخدمة بأكملها أو لديها أخطاء. يتم استخدام السجل الثاني ، الذي سمي باسم اسم الخدمة (أي اسم التطبيق الخاص بي) ، بواسطة شاشة Windows Node. من الممكن الكتابة إلى هذا السجل من البرنامج النصي Node.js باستخدام تسجيل حدث Node-Windows.
الجديد اعتبارًا من v0.1.0 هو أداة تسجيل لحدث غير C ++ . يمكن أن تكتب هذه الأداة المساعدة إلى سجل الأحداث ، مما يجعل سجلاتك مرئية من عارض الحدث. ويستخدم الحدث تحت الغطاء.
لإنشاء مسجل:
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.' ) ;يشبه:
تتوفر بعض الخيارات الأقل استخدامًا أيضًا من خلال تسجيل الأحداث في Node-Windows.
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ; كل نوع سجل (المعلومات ، والتحذير ، والخطأ ، ومراجعة المراجعة ، و AuditFailure) يقبل اختياريا وسيطتين إضافيتين ، بما في ذلك رمز ورد اتصال . بشكل افتراضي ، رمز الحدث هو 1000 إذا لم يتم تحديده بطريقة أخرى. لتوفير رمز حدث مخصص مع رسالة سجل واكتب هذه الرسالة إلى وحدة التحكم ، يمكن استخدام الرمز التالي:
إشعار: يبدو أن EventCreate يدعم فقط المعرف المخصص <= 1000.
log . info ( 'Something different happened!' , 700 , function ( ) {
console . log ( 'Something different happened!' ) ;
} ) ; بشكل افتراضي ، تعد سجلات الأحداث كلها جزءًا من نطاق APPLICATION . لكن؛ من الممكن أيضًا استخدام سجل SYSTEM . للقيام بذلك ، يجب تمرير كائن التكوين إلى السجل الجديد:
var EventLogger = require ( 'node-windows' ) . EventLogger ;
var log = new EventLogger ( {
source : 'My Event Log' ,
eventLog : 'SYSTEM'
} ) ;يمكن قمع سجلات أحداث التحذير التي يتم إنتاجها بواسطة Wrapper عن طريق تعطيلها عند إنشاء الخدمة. يتم تمكين سجلات التحذير بشكل افتراضي.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
disableWarningLogs : true ,
} ) ;تشحن Wod-Windows مع عدة أوامر لتبسيط المهام على Windows MS.
يشبه Elevate sudo على Linux/Mac. يحاول رفع امتيازات المستخدم الحالي إلى مسؤول محلي. لا يتطلب استخدام هذا كلمة مرور ، ولكنه يتطلب أن يكون للمستخدم الحالي امتيازات إدارية. بدون هذه الامتيازات ، سيفشل الأمر مع خطأ access denied .
على أنظمة مع تمكين UAC ، قد يدفع هذا المستخدم للحصول على إذن للمتابعة:
بناء الجملة :
elevate(cmd[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . يعمل Sudo بشكل مشابه لـ sudo على Linux/Mac. على عكس الارتفاع ، فإنه يتطلب كلمة مرور ، لكنه لن يطالب المستخدم بإذن للمتابعة. مثل Elevate ، لا يزال هذا يتطلب امتيازات إدارية للمستخدم ، وإلا سيفشل الأمر. الفرق الأساسي بين هذا و elevate () هو المطالبة.
بناء الجملة :
sudo(cmd,password[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . يحدد هذا الأمر غير المتزامن ما إذا كان المستخدم الحالي لديه امتيازات إدارية. يمرر قيمة منطقية إلى رد الاتصال ، وإرجاع true إذا كان المستخدم مسؤولًا أو false إذا لم يكن كذلك.
مثال
var wincmd = require ( 'node-windows' ) ;
wincmd . isAdminUser ( function ( isAdmin ) {
if ( isAdmin ) {
console . log ( 'The user has administrative privileges.' ) ;
} else {
console . log ( 'NOT AN ADMIN' ) ;
}
} ) ; تستفسر طريقة القائمة من نظام التشغيل لقائمة عمليات التشغيل.
var wincmd = require ( 'node-windows' ) ;
wincmd . list ( function ( svc ) {
console . log ( svc ) ;
} , true ) ; هذا يعيد مجموعة من عمليات التشغيل. يوفر توفير الوسيطة true الاختيارية في المثال أعلاه قائمة مع إخراج مطول. الإخراج خاص بإصدار نظام التشغيل. فيما يلي مثال على الإخراج المطول على جهاز كمبيوتر يعمل بنظام 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'
} ] عادةً ما يوفر الإخراج العادي (غير الزوار) ImageName و PID و SessionName و Session# و MemUsage و CPUTime .
هذه الطريقة سوف تقتل عملية من قبل PID .
var wincmd = require ( 'node-windows' ) ;
wincmd . kill ( 12345 , function ( ) {
console . log ( 'Process Killed' ) ;
} ) ; في هذا المثال ، سيتم قتل معرف العملية 12345 . من المهم أن نلاحظ أن حساب المستخدم الذي ينفذ هذا البرنامج النصي العقدة قد يتطلب امتيازات إدارية.
إذا كنت تواجه مشكلات مع الأمثلة ، فيرجى مراجعة ملف TESTS.md .
إذا كنت تواجه حدث InvalidInstallation ، فقم بإلقاء نظرة على دليل daemon الذي يتم إنشاؤه أثناء التثبيت للتأكد من وجود ملفات .exe و .xml . في بعض الحالات ، في المقام الأول خلال _un_installation ، من الممكن أن تقوم العملية بقفل ملف السجل مؤقتًا ، مما يمنع Windows من إزالته. في هذا السيناريو ، ما عليك سوى تشغيل إلغاء التثبيت مرة أخرى. في معظم الحالات ، سيصلح هذا المشكلة. إذا لم يكن الأمر كذلك ، فقم بإزالة دليل daemon يدويًا قبل تشغيل التثبيت مرة أخرى.
كان هناك العديد من المساهمين الذين فعلوا كل شيء من الالتزام بميزات إلى المساعدة في التقاط Slack أثناء غمرتي. أنا أقدر بشكل لا يصدق المساعدة.
شكر خاص لـ Arthurblake الذي تمت إضافة تعديلاته أخيرًا. بفضل @hockeytim11 ، الذي ساعد في تجميع وتحديث مجموعة من المشكلات المعلقة وبدأوا في تقديم الدعم إلى مكتبات العقدة الأخرى.
Winsw و Sudowin هي حقوق الطبع والنشر لأصحابها. يتم توزيع Winsw تحت رخصة معهد ماساتشوستس للتكنولوجيا. يتم توزيع Sudowin بموجب ترخيص BSD.
جميع البرامج النصية الأخرى هي حقوق الطبع والنشر (C) Corey Butler بموجب ترخيص MIT.
(ترخيص معهد ماساتشوستس للتكنولوجيا)
حقوق الطبع والنشر (C) 2013 Corey Butler
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام الأشخاص ونسخها ودمجها ودمجها وتوزيعها وتوزيعها على ذلك:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجارات. لا يجوز بأي حال من الأحوال أن يكون المؤلفون أو حاملي حقوق الطبع والنشر مسؤولاً عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن أو خارج البرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.