이 라이브러리는 생산 환경을위한 Windows 배경 서비스로 노드 스크립트를 설치/시작/중지/제거하는 데 사용될 수 있습니다. 이것은 응용 프로그램을 개발하기위한 도구가 아니며 응용 프로그램을 공개하는 도구입니다. 이 도구는 Node.js의 버전이 컴퓨터에 설치된 앱을 실행하는 실행 파일을 생성합니다.
해당 운영 체제를 지원 해야하는 경우 Node-Mac 및 Node-Linux를 참조하십시오.
당신이 나를 필요로한다면 나에게 트윗하십시오 (@goldglovecb).
![]() | ![]() | ![]() | ![]() |
후원 할 수 없습니까? github 스타의 @coreybutler를 지명하는 것을 고려하십시오. | |||
다음 기능은 노드 윈도우에서 사용할 수 있습니다.
exec 명령을 실행하십시오.Node-Windows를 설치하는 것이 권장되는 방법은 NPM을 사용하여 Global Flag를 사용합니다.
npm install -g node-windows
그런 다음 프로젝트 루트에서 실행하십시오.
npm link node-windows
하지만; 글로벌 플래그없이 노드 창을 사용할 수 있습니다 (즉, 프로젝트 루트에 직접 설치). 이것이 권장되는 접근법이 아닌 이유에 대한 자세한 내용은이 readme에서 제공됩니다.
Windows에서 기본 노드 모듈을 사용하면 빨 수 있습니다. 대부분의 기본 모듈은 이진 형식으로 배포되지 않습니다. 대신,이 모듈은 npm 에 의존하여 Node-Gyp를 사용하여 프로젝트를 구축합니다. 이는 개발자가 기본 모듈을 설치하기 위해 시스템에 비주얼 스튜디오 (및 잠재적으로 다른 소프트웨어)를 설치해야 함을 의미합니다. 이것은 휴대용이지만 고통 스럽습니다 ... 대부분 비주얼 스튜디오 자체가 2GB 이상이기 때문입니다.
Node-Windows는 기본 모듈을 사용하지 않습니다. 일부 바이너리/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 스크립트를 식별합니다. 이를 실행하면 스크립트가 Windows Services 유틸리티에서 볼 수 있습니다.
Service 객체는 다음 이벤트를 제시합니다.
위의 예에서 스크립트는 install 이벤트에 대해 듣습니다. 이 이벤트는 서비스 설치가 완료되면 해고되므로 서비스를 시작하는 것이 안전합니다.
Node-Windows에서 만든 서비스는 Windows에서 실행되는 대부분의 다른 서비스와 유사합니다. Windows Service 유틸리티에서 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 서비스를위한 내장 서비스 복구는 상당히 제한되어 있으며 코드에서 쉽게 구성 할 수 없습니다. 따라서 Node-Windows는 Node.js 스크립트 주변에 래퍼를 만듭니다. 이 래퍼는 실패한 서비스를 지능적이고 구성 가능한 방식으로 다시 시작할 책임이 있습니다. 예를 들어, 알 수없는 오류로 인해 스크립트가 충돌하면 노드 위도우가 다시 시작하려고 시도합니다. 기본적으로 이것은 매 초마다 발생합니다. 하지만; 스크립트에 치명적인 결함이있는 경우 반복적으로 충돌하는 경우 시스템에 불필요한 오버 헤드가 추가됩니다. Node-Windows는 재시작 사이의 시간 간격을 늘리고 최대 재시작 수를 캡핑하여이를 처리합니다.
서버를 펌핑하지 않는 Smarter Resparts :
기본 설정을 사용하여 Node-Windows는 스크립트를 다시 시작해야 할 때마다 대기 간격에 25%를 추가합니다. 기본 설정 (1 초)에서 첫 번째 재시작 시도는 1 초 후에 발생합니다. 두 번째는 1.25 초 후에 발생합니다. 1.56 초 후 (1.25가 25%증가) 등 3 위. 초기 대기 시간과 성장률은 모두 새로운 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 초 후입니다.
스스로를하지 마세요!
반복적 인 재활용은 잠재적으로 나쁜 대본으로 영원히 계속 될 수 있습니다. 이러한 상황을 처리하기 위해 Node-Windows는 두 가지 종류의 캡을 지원합니다. maxRetries 사용하면 최대 재시작 시도 수가 발생합니다. 기본적으로 이것은 무제한입니다. 3으로 설정하면 프로세스가 3 번 실패한 후 프로세스를 더 이상 다시 시작하지 않도록합니다. 또 다른 옵션은 maxRestarts 로 60 초 이내에 시도 된 재시작 수를 캡처합니다. 예를 들어, 이것이 3 (기본값)으로 설정되고 프로세스가 반복적으로 충돌/재시작하면 Node-Windows는 60 초의 창에서 3 차주기 후 다시 시작 시도를 중단합니다. wait 또는 grow 과 마찬가지로이 구성 옵션을 모두 설정할 수 있습니다.
마지막으로, abortOnError 라는 속성을 오류로 종료 할 때 스크립트가 전혀 다시 시작되지 않으 려면 true 로 설정할 수 있습니다.
Node-Windows는 Winsw 유틸리티를 사용하여 서비스로 배포 된 각 node.js 스크립트에 대해 고유 한 .exe 만듭니다. daemon 이라는 디렉토리는 myappname.exe 및 myappname.xml 로 생성되고 채워집니다. XML 파일은 실행 파일을위한 구성입니다. 또한 winsw 이 디렉토리 (이벤트 로그에서 볼 수 있음)에서 자체 로그를 작성합니다.
myappname.exe 파일은 스크립트를 모니터링하고 관리하는 노드 윈도우 래퍼를 시작합니다. 이 파일은 Node-Windows의 일부이므로 Node-Windows 디렉토리를 이동하면 .exe 파일이 Node.js 스크립트를 찾을 수 없습니다. 하지만; 권장 설치 지침에 따라 Node-Windows가 전 세계적으로 설치된 경우 문제가되지 않아야합니다.
이 모든 데몬 특정 파일은 Node.js 스크립트가 저장되는 동일한 디렉토리에서 작성된 daemon 이라는 서브 디렉토리로 작성됩니다. 서비스를 제거하면 이러한 파일이 제거됩니다.
이벤트 로깅
Node-Windows로 만든 서비스에는 Windows 이벤트 뷰어를 통해 볼 수있는 두 개의 이벤트 로그가 있습니다. myappname.exe 라는 로그 소스는 실행 파일에 대한 기본 로깅을 제공합니다. 전체 서비스가 시작/중지되거나 오류가 발생하는시기를 확인하는 데 사용할 수 있습니다. 서비스 이름 (예 : 내 앱 이름)의 이름을 따서 명명 된 두 번째 로그는 Node-Windows 모니터에서 사용됩니다. Node-Windows 이벤트 로깅을 사용하여 Node.js 스크립트 에서이 로그에 쓸 수 있습니다.
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.' ) ;유사하게 보입니다.
Node-Windows 이벤트 로깅을 통해 사용 가능한 일부 옵션도 제공됩니다.
log . auditSuccess ( 'AUser Login Success' ) ;
log . auditFailure ( 'AUser Login Failure' ) ; 각 로그 유형 (정보, 경고, 오류, AuditSuccess 및 AuditFailure) 메소드는 선택적으로 코드 및 콜백을 포함한 두 가지 추가 인수를 수락합니다. 기본적으로 이벤트 코드는 달리 지정되지 않은 경우 1000 입니다. 로그 메시지와 함께 사용자 정의 이벤트 코드를 제공하고 해당 메시지를 콘솔에 작성하려면 다음 코드를 사용할 수 있습니다.
통지 : EventCreate는 Custom ID <= 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 ,
} ) ;Node-Windows는 MS Windows에서 작업을 단순화하기 위해 여러 명령을 제공합니다.
Elevate는 Linux/Mac의 sudo 와 유사합니다. 현재 사용자의 권한을 로컬 관리자로 높이려고합니다. 이를 사용하려면 비밀번호가 필요하지 않지만 현재 사용자는 관리 권한이 필요합니다. 이러한 권한이 없으면 access denied 오류로 명령이 실패합니다.
UAC가 활성화 된 시스템에서는 사용자에게 진행할 수있는 권한이 있습니다.
구문 :
elevate(cmd[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . Sudo는 Linux/Mac의 sudo 와 유사하게 행동합니다. Elevate 와 달리 비밀번호가 필요하지만 사용자에게 진행할 수있는 권한을 부여하지는 않습니다. Elevate 와 마찬가지로, 이것은 여전히 사용자에게 관리 권한이 필요합니다 . 그렇지 않으면 명령이 실패합니다. 이것과 elvate () 의 주요 차이점은 프롬프트입니다.
구문 :
sudo(cmd,password[,options,callback])
require('child_process').exec(cmd,<OPTIONS>,callback) .require('child_process').exec(cmd,options,<CALLBACK>) . 이 비동기 명령은 현재 사용자가 관리 권한을 가지고 있는지 여부를 결정합니다. 콜백에 부울 값을 전달하여 사용자가 관리자이거나 그렇지 않은 경우 false 경우 true 반환합니다.
예
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'
} ] 정기적 인 (비 Verbose) 출력은 일반적으로 ImageName , PID , SessionName , Session# , MemUsage 및 CPUTime 제공합니다.
이 방법은 PID 에 의해 프로세스를 죽입니다.
var wincmd = require ( 'node-windows' ) ;
wincmd . kill ( 12345 , function ( ) {
console . log ( 'Process Killed' ) ;
} ) ; 이 예에서 프로세스 ID 12345 죽을 것입니다. 이 노드 스크립트를 실행하는 사용자 계정에는 관리 권한이 필요할 수 있습니다.
예제에 문제가있는 경우 TESTS.md 파일을 검토하십시오.
InvalidInstallation 이벤트가 발생하면 설치 중에 생성 된 daemon 디렉토리를 살펴보고 .exe 및 .xml 파일이 있는지 확인하십시오. 어떤 상황에서는 주로 _UN_INSTALLATION에서 로그 파일을 일시적으로 잠그는 것이 포버가되므로 Windows가 제거되는 것을 방지합니다. 이 시나리오에서는 다시 제거를 실행하십시오. 대부분의 경우 이것은 문제를 해결합니다. 그렇지 않은 경우 설치를 다시 실행하기 전에 daemon 디렉토리를 수동으로 제거하십시오.
제가 늪에 빠진 동안 기능을 저지르는 것부터 느슨한 수치를 돕는 것에 이르기까지 모든 일을 한 많은 기고자들이있었습니다. 나는 도움에 대해 매우 감사합니다.
수정이 마침내 추가 된 @Arthurblake에게 특별한 감사를드립니다. @hockeytim11 덕분에 많은 뛰어난 문제를 컴파일하고 업데이트하고 다른 노드* 라이브러리를 지원하기 시작했습니다.
Winsw와 Sudowin은 해당 소유자의 저작권입니다. Winsw는 MIT 라이센스에 따라 배포됩니다. Sudowin은 BSD 라이센스에 따라 배포됩니다.
다른 모든 스크립트는 MIT 라이센스에 따른 Corey Butler 저작권 (C) Corey Butler입니다.
(MIT 라이센스)
저작권 (C) 2013 Corey Butler
이에 따라이 소프트웨어 및 관련 문서 파일 ( '소프트웨어')의 사본을 얻는 사람에게는 허가가 부여됩니다. 소프트웨어의 사용, 복사, 수정, 합병, 배포, 배포, 숭고 및/또는 소프트웨어의 사본을 판매 할 권한을 포함하여 제한없이 소프트웨어를 처리 할 수 있도록 소프트웨어를 제공 할 권한이 없습니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증 없이도 '있는 그대로'제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.