为了账号安全,请及时绑定邮箱和手机立即绑定

[node-startup]如何正确地编写和使用service脚本?

[node-startup]如何正确地编写和使用service脚本?

RISEBY 2019-04-13 08:45:27
目前有一个Node.js应用,如用parent.js管理(两个)child.js进程,在parent.js中的做法是:varcp=require('child_process');functionspawn(server,config){logger.log('spawn'+server);//输出spawn/usr/local/app/child.jsworker=cp.spawn('node',[server,config]);worker.on('exit',function(code){if(code!==0){logger.log('code='+code);//输出code=8spawn(server,config);}});returnworker;}varworker=spawn('./child.js');在终端中启动nodeparent.js正常编写自启动脚本app,拷贝到/etc/init.d目录使用/etc/init.d/appstart启动正常使用serviceappstart启动出错出错可以参照parent.js源码的注释部分。附自启动脚本的写法:#!/bin/shNODE_ENV="production"NODE_APP='app.js'APP_DIR='/var/www/example.com';PID_FILE=$APP_DIR/pid/app.pidLOG_FILE=$APP_DIR/log/app.logCONFIG_DIR=$APP_DIR/configPORT=3000NODE_EXEC=`whichnode`################REDHATchkconfigheader#chkconfig:-5874#description:node-appisthescriptforstartinganodeapponboot.###BEGININITINFO#Provides:node#Required-Start:$network$remote_fs$local_fs#Required-Stop:$network$remote_fs$local_fs#Default-Start:2345#Default-Stop:016#Short-Description:startandstopnode#Description:Nodeprocessforapp###ENDINITINFOstart_app(){if[-f$PID_FILE]thenecho"$PID_FILEexists,processisalreadyrunningorcrashed"exit1elseecho"Startingnodeapp..."PORT=$PORTNODE_ENV=$NODE_ENVNODE_CONFIG_DIR=$CONFIG_DIR$NODE_EXEC$APP_DIR/$NODE_APP1>$LOG_FILE2>&1&echo$!>$PID_FILE;fi}stop_app(){if[!-f$PID_FILE]thenecho"$PID_FILEdoesnotexist,processisnotrunning"exit1elseecho"Stopping$APP_DIR/$NODE_APP..."echo"Killing`cat$PID_FILE`"kill`cat$PID_FILE`;rm-f$PID_FILE;echo"Nodestopped"fi}case"$1"instart)start_app;;stop)stop_app;;restart)stop_appstart_app;;status)if[-f$PID_FILE]thenPID=`cat$PID_FILE`if[-z"`psef|awk'{print$1}'|grep"^$PID$"`"]thenecho"Nodeappstoppedbutpidfileexists"elseecho"Nodeapprunningwithpid$PID"fielseecho"Nodeappstopped"fi;;*)echo"Usage:$0{start|stop|restart|status}"exit1;;esacgithub地址:https://github.com/chovy/node-startup/blob/master/init.d/node-app问题解决:1.在shell脚本中加入exportNODE_PATH=/usr/local/lib/node_modules2.执行app时,先cd$APP_DIRUPDATE:1.在start_app方法中创建/var/lock/subsys/app文件,这样系统关机时才会调用app脚本的stop_app方法。
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

总结下答案:
在shell脚本中加入exportNODE_PATH=/usr/local/lib/node_modules
执行app时,先cd$APP_DIR
在start_app方法中创建/var/lock/subsys/app文件,这样系统关机时才会调用app脚本的stop_app方法。
                            
查看完整回答
反对 回复 2019-04-13
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

最好cd到app目录去,这样才能确保找到你安装到本地的node_modules。
cd$APP_DIR&&PORT=$PORTNODE_ENV=$NODE_ENVNODE_CONFIG_DIR=$CONFIG_DIR$NODE_EXEC$NODE_APP1>$LOG_FILE2>&1&
我猜你在执行/etc/init.d/appstart的时候恰好就在parent.js所在的目录,于是恰好就能正常找到node_modules,给你造成了启动脚本没问题的错觉。而使用service运行时,这个service脚本重置了$PWD,让node找不到node_modules,从而导致问题。
总是先cd再执行node脚本是避免出错的最好方法~
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 416 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信