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


    手上项目中有一块服务是用node.js实现的,运行环境是windows server 2008 R2,刚开始着手实现这块功能的时候时间很紧迫,随便写了个console程序就部署上去了……启动方式就是在 CMD 里输入node main.js
    然而这样搞肯定是不行的啊!这样搞的话,万一有哪个 Error 没捕获到,整个服务就挂了,虽然咱写的代码很严谨,跑了一个多月也没挂,但为了万无一失,还是得有个自动重启的能力。
    而且更关键的问题是……现在这样好low啊……开机后需要手动启动,而且运行的时候一直会显示一个 console ……这根本就忍不了啊!

    目标:

    支持崩溃后自动重启
    支持后台运行
    开机自动启动

    自动重启和后台运行

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

    npm install -g forever
    

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

    node d:xxxmain.js
    

    使用 forever 后的:

    forever start -o out.log -e err.log d:xxxmain.js
    

    如果不出问题的话,应该就可以了~
    然而每次你这样想的时候,就该出问题了_(:з)∠)_

    forever 这家伙居然不认 windows 下的绝对路径…… 假如我是在c:UsersAdministrator下执行的命令,那么 forever 就会尝试去 c:UsersAdministratord:xxx下面寻找main.js……
    辣鸡windows!
    没错,除非路径的第一个字符是 / ,否则就会被当成相对路径来处理。
    坑爹啊(╯‵□′)╯︵┻━┻
    或许是我用不惯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 的错误

    注册服务不行……那就只好用计划任务了……
    新建一个计划任务,然后系统启动时的触发器,由这个计划任务来执行我们的bat


    嘛……这种方法最后是生效了,唯一需要注意的就是安全选项中,一定要选中 "不管用户是否登录都要运行" 的选项!!
    否则会在系统启动触发器被触发的时候,因为没有用户登录,所以直接跳过了这个计划任务,进而无法启动我们的服务。

    以上,虽然还有不完善的地方,但确实实现了预期的效果;
    有任何更好的建议,或者疑问,欢迎评论~

    最后说一句……windows服务器真TM麻烦……

  • 相关阅读:
    41.分词器简单介绍
    40.倒排索引核心原理
    39.exact value and full text
    38.mapping小例子
    37.query string、_all metadata
    36.分页及deep paging
    35.multi-index和multi-type搜索模式
    BZOJ 1680 [Usaco2005 Mar]Yogurt factory:贪心【只用考虑上一个】
    BZOJ 1637 [Usaco2007 Mar]Balanced Lineup:前缀和 + 差分
    BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算
  • 原文地址:https://www.cnblogs.com/Eden-cola/p/auto-start-node-service.html
Copyright © 2020-2023  润新知