node.js程序作为服务并在windows下开机自启动(用forever)


Posted in Javascript onMarch 29, 2017

前言

最近项目中有一块服务是用node.js实现的,运行环境是windows server 2008 R2,刚开始着手实现这块功能的时候时间很紧迫,随便写了个console程序就部署上去了……启动方式就是在 CMD 里输入node main.js。

然而这样搞肯定是不行的啊!这样搞的话,万一有哪个 Error 没捕获到,整个服务就挂了,虽然咱写的代码很严谨,跑了一个多月也没挂,但为了万无一失,还是得有个自动重启的能力。

而且更关键的问题是……现在这样好low啊……开机后需要手动启动,而且运行的时候一直会显示一个 console ……这根本就忍不了啊!

目标:

  1.  支持崩溃后自动重启
  2.  支持后台运行
  3.  开机自动启动

自动重启和后台运行

因为 javascript 的单线程运行方式,一点错误就彻底崩溃的特性,自动重启的解决方案自然也早就有了,比如 pm2 和 forever ,从功能上看,pm2 比 forever 要强大不少,然而我只想要个 "Keep Alive" ,所以我选择了 forever.

先全局安装 forever

npm install -g forever

然后把启动用的bat脚本修改一下……

旧的启动脚本:

node d:\xxx\main.js

使用 forever 后的:

forever start -o out.log -e err.log d:\xxx\main.js

如果不出问题的话,应该就可以了~

然而每次你这样想的时候,就该出问题了_(:з)∠)_

forever 这家伙居然不认 windows 下的绝对路径…… 假如我是在c:\Users\Administrator下执行的命令,那么 forever 就会尝试去 c:\Users\Administrator\d:\xxx\下面寻找main.js……

node.js程序作为服务并在windows下开机自启动(用forever)

没错,除非路径的第一个字符是 / ,否则就会被当成相对路径来处理。

坑爹啊。

或许是我用不惯windows的缘故,反正我是没找到好的解决办法,最终迫于无奈,在bat脚本中手动切换了一下盘符处理了

最后的脚本:

@echo off
d:
forever start -o xxx/logs/out.log -e xxx/logs/err.log --uid "communityWorker" xxx/main.js

其实我总是感觉这种做法不太对,但对 windows 实在不熟悉,如果谁有更好的办法也请评论告诉我

开机自动启动

既然是自动启动嘛,我首先想到的就是注册一个自启动的服务,然而注册的似乎只能是一个exe,用bat注册服务会报出一个 1053 的错误

node.js程序作为服务并在windows下开机自启动(用forever)

注册服务不行……那就只好用计划任务了……

新建一个计划任务,然后系统启动时的触发器,由这个计划任务来执行我们的bat

node.js程序作为服务并在windows下开机自启动(用forever)

node.js程序作为服务并在windows下开机自启动(用forever)

嘛……这种方法最后是生效了,唯一需要注意的就是安全选项中,一定要选中 "不管用户是否登录都要运行" 的选项!!

否则会在系统启动触发器被触发的时候,因为没有用户登录,所以直接跳过了这个计划任务,进而无法启动我们的服务。

node.js程序作为服务并在windows下开机自启动(用forever)

虽然还有不完善的地方,但确实实现了预期的效果;最后说一句……windows服务器真TM麻烦……

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js option删除代码集合
Nov 12 Javascript
javaScript call 函数的用法说明
Apr 09 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
Jan 12 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
分享一道关于闭包、bind和this的面试题
Feb 20 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
Aug 25 Javascript
微信小程序pinker组件使用实现自动相减日期
May 07 Javascript
jQuery实现飞机大战小游戏
Jul 05 jQuery
jQuery实现字体颜色渐变效果的方法
Mar 29 #jQuery
整理关于Bootstrap导航的慕课笔记
Mar 29 #Javascript
javascript 中Cookie读、写与删除操作
Mar 29 #Javascript
移动端利用H5实现压缩图片上传功能
Mar 29 #Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
Mar 29 #Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 #Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
Mar 29 #Javascript
You might like
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python3 求约数的实例
2019/12/05 Python
python性能测试工具locust的使用
2020/12/28 Python
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
百度软件工程师职位
2013/02/14 面试题
校园文明倡议书
2014/05/16 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
严以用权学习心得体会
2016/01/12 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript