主页

将nodejs启动成系统服务

将nodejs启动成系统服务

通常会需要在本地启动一个或多个node服务器,但是一般情况下,都是用cmd命令窗口进行启动,启动服务器后,服务器的日志就输出到这个cmd窗口中,这样就可能会占用好几个cmd窗口(必须要同时保持打开),所以很不方便。

所以,如果能将cmd窗口在后台静默的启动并运行,将会方便很多。这个功能可以用 node-windows 这个包来实现。

 

node-windows

npm官网: https://www.npmjs.com/package/node-windows
github官网: https://github.com/coreybutler/node-windows

 

安装

npm install node-windows@1.0.0-beta.6 --save 

注意,不能使用最新版本,最新版本有问题,启动不了,版本太低了也有问题,目前经测试,beta.6版本是可以的。

 

service-install.js 运行这个文件即可安装windows系统服务

复制代码
var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
    name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe
    description: 'The nodejs.org example web server.',
    // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址
    script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址
    // nodeOptions: [
    //     '--harmony',
    //     '--max_old_space_size=4096'
    // ]
    //, workingDirectory: '...'
    //, allowServiceLogon: true
});

svc.on('install', function () { // 服务安装完成的事件
    svc.start(); // 安装完成后,立即启动 node.js
});

svc.install(); // 安装服务
复制代码

 

 

service-uninstall.js 运行这个文件即可卸载windows系统服务

复制代码
var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
    name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe
    description: 'The nodejs.org example web server.',
    // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址
    script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址
    // nodeOptions: [
    //     '--harmony',
    //     '--max_old_space_size=4096'
    // ]
    //, workingDirectory: '...'
    //, allowServiceLogon: true
});

svc.on('uninstall', function () { // 卸载完成后的事件
    console.log('Uninstall complete.');
    console.log('The service exists: ', svc.exists);
});
svc.uninstall(); // 从windows系统中卸载服务
复制代码

 

 

service-restart.js  运行这个文件即可重启windows系统服务

复制代码
var Service = require('node-windows').Service;
var exec = require('child_process').exec;

// Create a new service object
var svc = new Service({
    name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe
    description: 'The nodejs.org example web server.',
    // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址
    script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址
    // nodeOptions: [
    //     '--harmony',
    //     '--max_old_space_size=4096'
    // ]
    //, workingDirectory: '...'
    //, allowServiceLogon: true
});

svc.on('start', function () { // 服务启动完成的事件
    console.log('启动完成???'); // 注意,到这一步,虽然输出了启动完成,但如果项目中有报错,则会立即关闭服务且没有通知
    checkStart();
});

svc.restart(); // 重启服务
svc.serviceName = svc.id + '.exe'; // 真正运行的服务名

function checkStart(){
    setTimeout(()=>{
        let cmdStr = `sc query ${svc.serviceName}`;
        exec(cmdStr, function(error, stdout, stderr) {
            if(!error){
                if(stdout.indexOf('4 RUNNING') > -1){
                    console.log('真正的启动成功了!!');
                    return;
                }
            }
        });
        console.error(error);
    }, 1000);
}
复制代码

 

 

 

注意事项

每次修改项目代码后,需要重启服务才能生效。可以运行 service-uninstall.js重启,也可以在任务管理器中重启服务,还可以在 我的电脑右键==》管理==》服务 中重启。

安装服务完成后,会自动在要运行的js文件的同目录下生成 acemon文件夹,里面有项目运行的日志(本来应该在控制台输出的那种),运行node-windows本身的错误日志,打包成的.exe文件。

 

posted @   平凡人就做平凡事  阅读(820)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示