Эта библиотека может использоваться для установки/запуска/остановки/удаления сценариев узлов в качестве фоновых служб Windows для производственных сред. Это не инструмент для разработки приложений, это инструмент для их освобождения. Этот инструмент генерирует исполняемый файл, который будет запускать ваше приложение с какой -либо версией Node.js, установленной на компьютере.
См. Node-MAC и Node-Linux, если вам нужно поддерживать эти операционные системы.
Твитнуть меня (@goldglovecb), если я вам нужен.
![]() | ![]() | ![]() | ![]() |
Не может спонсировать? Рассмотрим номинацию @coreybutler для звезды Github. | |||
Следующие функции доступны в узлах:
exec в качестве Sudoer.Рекомендуемый способ установить узловые окны с NPM, используя глобальный флаг:
npm install -g node-windows
Затем, в корне проекта, запустите:
npm link node-windows
Однако; Можно использовать узловые окны без глобального флага (т.е. установка непосредственно в корне проекта). Более подробная информация о том, почему это не рекомендуемый подход, доступен на протяжении всего этой Readme.
Использование нативных модулей узлов в окнах может отсосать. Большинство местных модулей не распределены в бинарном формате. Вместо этого эти модули полагаются на npm для создания проекта, используя узлы-гип. Это означает, что разработчики должны установить в систему Visual Studio (и потенциально другое программное обеспечение), просто чтобы установить нативный модуль. Это портативно, но болезненно ... в основном потому, что сама Visual Studio более 2 ГБ.
Узел-окны не используют собственные модули. Есть некоторые бинарные/EXE утилиты, но все, что необходимо для выполнения более сложных задач, упаковано и распределено в легко полезном формате. Так что нет необходимости в Visual Studio ... по крайней мере, не для этого модуля.
Node-Windows имеет утилиту для запуска сценариев node.js в качестве сервисов 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, который должен работать как сервис. После запуска сценарий будет виден из утилиты Services Windows.
Объект Service излучает следующие события:
В примере выше, скрипт прослушивает событие install . Поскольку это событие запускается, когда установка услуг завершена, безопасно для запуска обслуживания.
Услуги, созданные узлами-окнами, аналогичны большинству других сервисов, работающих в 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 Services довольно ограничено и не может быть легко настроено из кода. Следовательно, узлы-окны создают обертку вокруг сценария Node.js. Эта обертка отвечает за перезапуск неудачного сервиса интеллектуальным и настраиваемым образом. Например, если ваш скрипт вылетает из-за неизвестной ошибки, узлы-окты попытаются перезапустить его. По умолчанию это происходит каждую секунду. Однако; Если сценарий имеет роковой недостаток, который заставляет его трахаться неоднократно, он добавляет ненужные накладные расходы в систему. Узел-окны обрабатывает это, увеличивая интервал времени между перезапуску и ограничивая максимальное количество перезапусков.
Умнее перезагрузки, которые не бьют по вашему серверу:
Используя настройки по умолчанию, Node-Windows добавляет 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
} ) ;В этом примере период ожидания начнется на 2 секунды и увеличится на 50%. Таким образом, вторая попытка будет через 3 секунды, а четвертый - 4,5 секунды спустя.
Не сами!
Повторяющаяся переработка может потенциально продолжаться навсегда с плохим сценарием. Чтобы справиться с этими ситуациями, узловые окна поддерживают два вида крышек. Использование maxRetries ограничит максимальное количество попыток перезапуска. По умолчанию это не ограничено. Установка его на 3 сообщит процессу больше не перезагружать процесс после того, как он потерпел неудачу 3 раза. Другой вариант - maxRestarts , который ограничивает количество перезапусков, предпринятых в течение 60 секунд. Например, если это установлено в 3 (по умолчанию), а процесс сбоят/перезагружается неоднократно, узлы-ветки прекратят перезапуск попыток после 3-го цикла в 60-секундном окне. Оба эти параметра конфигурации могут быть установлены, как wait или grow .
Наконец, атрибут, называемый abortOnError может быть установлен на true если вы хотите, чтобы ваш скрипт не перезапустился вообще, когда он выходит с ошибкой.
Node-Windows использует утилиту Winsw для создания уникального .exe для каждого скрипта Node.js, развернутого в качестве услуги. Каталог под названием daemon создан и населен myappname.exe и myappname.xml . Файл XML является конфигурацией для исполняемого файла. Кроме того, winsw создаст для себя несколько журналов в этом каталоге (которые можно просматривать в журнале событий).
Файл myappname.exe запускает обертку узлов, которая отвечает за мониторинг и управление сценарием. Поскольку этот файл является частью узлов-Windows, перемещение каталога Node-Windows может привести к тому, что файл .exe не сможет найти скрипт node.js. Однако; Это не должно быть проблемой, если узел-окна установлены во всем мире, согласно рекомендуемым инструкциям по установке.
Все эти файлы, специфичные для демона, создаются в подкаталоге, называемом daemon , который создается в том же каталоге, где сохранен скрипт node.js. Удаление службы удалит эти файлы.
Журнализация событий
Услуги, созданные с помощью узлов, имеют два журнала событий, которые можно просмотреть через просмотр просмотра событий Windows. Источник журнала с именем myappname.exe предоставляет базовый журнал для исполняемого файла. Это может быть использовано, чтобы увидеть, когда все служба запускается/останавливается или имеет ошибки. Второй журнал, названный в честь вашего имени службы (т.е. имя моего приложения), используется монитором узлов. Можно записать в этот журнал из скрипта Node.js, используя журнал событий Node-Windows.
Новым по состоянию на v0.1.0 является утилита регистрации событий, не являющихся C ++ . Эта утилита может записать в журнал событий, что делает ваши журналы видимыми от просмотра событий. Он использует EventCreate под капюшоном.
Чтобы создать регистратор:
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.' ) ;Выглядит похоже на:
Некоторые из менее используемых параметров также доступны через регистрацию событий узлов.
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ; Каждый метод типа журнала (Info, Warn, Orirs, AuditCcess и AuditFailure). Опционально принимает два дополнительных аргумента, включая код и обратный вызов . По умолчанию код события составляет 1000 , если не указано иное. Чтобы предоставить пользовательский код события с сообщением журнала и написать это сообщение на консоли, можно использовать следующий код:
Примечание: он появляется только CREATE, поддерживающий только пользовательский идентификатор <= 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'
} ) ;Журналы предупреждения, которые производятся оберткой, могут быть подавлены, отключив ее при создании услуги. Предупреждающие журналы включены по умолчанию.
var svc = new Service ( {
name : 'Hello World' ,
description : 'The nodejs.org example web server.' ,
disableWarningLogs : true ,
} ) ;Узел-окрыдки отправляются с несколькими командами, чтобы упростить задачи на MS Windows.
Elepate похож на 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 , это все еще требует административных привилегий для пользователя, в противном случае команда потерпит неудачу. Основная разница между этим и elepate () является подсказкой.
Синтаксис :
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 , прежде чем снова запустить установку.
Было много участников, которые сделали все, от совершения функций до оказания помощи в сборе, когда я был завален. Я невероятно благодарен за помощь.
Особая благодарность @arthurblake, чьи изменения наконец были добавлены. Спасибо @Hockeytim11, который помог собрать и обновить кучу выдающихся вопросов и начал привлекать поддержку в другие библиотеки узла.
Winsw и Sudowin являются авторскими правами их соответствующих владельцев. Winsw распределен по лицензии MIT. Судовин распределен по лицензии BSD.
Все остальные сценарии являются авторским правом (C) Кори Батлер по лицензии MIT.
(Лицензия MIT)
Copyright (C) 2013 Кори Батлер
Настоящим предоставляется разрешение, бесплатно, любому лицу, получающему копию этого программного обеспечения и связанные с ними файлы документации («Программное обеспечение»), чтобы иметь дело в программном обеспечении без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распределение, сублиценность и/или продавать копии программного обеспечения и разрешения лиц, которым программное обеспечение подходит для того, чтобы поступить так, чтобы поступить на следующие условия: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: на следующие условия: на следующие условия.
Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части программного обеспечения.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной пригодности, пригодности для определенной цели и нераствования. Ни в коем случае авторы или владельцы авторских прав не будут нести ответственность за любые претензии, убытки или другую ответственность, будь то в действии контракта, деликт или иным образом, возникающие из или в связи с программным обеспечением или использованием или другими сделками в программном обеспечении.