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

目前有一个Node.js应用,如用parent.js管理(两个)child.js进程,在parent.js中的做法是:
varcp=require('child_process');
functionspawn(server,config){
logger.log('spawn'+server);//输出spawn/usr/local/app/child.js
worker=cp.spawn('node',[server,config]);
worker.on('exit',function(code){
if(code!==0){
logger.log('code='+code);//输出code=8
spawn(server,config);
}
});
returnworker;
}
varworker=spawn('./child.js');
在终端中启动nodeparent.js正常
编写自启动脚本app,拷贝到/etc/init.d目录
使用/etc/init.d/appstart启动正常
使用serviceappstart启动出错
出错可以参照parent.js源码的注释部分。
附自启动脚本的写法:
#!/bin/sh
NODE_ENV="production"
NODE_APP='app.js'
APP_DIR='/var/www/example.com';
PID_FILE=$APP_DIR/pid/app.pid
LOG_FILE=$APP_DIR/log/app.log
CONFIG_DIR=$APP_DIR/config
PORT=3000
NODE_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
###ENDINITINFO
start_app(){
if[-f$PID_FILE]
then
echo"$PID_FILEexists,processisalreadyrunningorcrashed"
exit1
else
echo"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]
then
echo"$PID_FILEdoesnotexist,processisnotrunning"
exit1
else
echo"Stopping$APP_DIR/$NODE_APP..."
echo"Killing`cat$PID_FILE`"
kill`cat$PID_FILE`;
rm-f$PID_FILE;
echo"Nodestopped"
fi
}
case"$1"in
start)
start_app
;;
stop)
stop_app
;;
restart)
stop_app
start_app
;;
status)
if[-f$PID_FILE]
then
PID=`cat$PID_FILE`
if[-z"`psef|awk'{print$1}'|grep"^$PID$"`"]
then
echo"Nodeappstoppedbutpidfileexists"
else
echo"Nodeapprunningwithpid$PID"
fi
else
echo"Nodeappstopped"
fi
;;
*)
echo"Usage:$0{start|stop|restart|status}"
exit1
;;
esac
github地址:https://github.com/chovy/node-startup/blob/master/init.d/node-app
问题解决:
1.在shell脚本中加入exportNODE_PATH=/usr/local/lib/node_modules
2.执行app时,先cd$APP_DIR
UPDATE:
1.在start_app方法中创建/var/lock/subsys/app文件,这样系统关机时才会调用app脚本的stop_app方法。
RISEBY
浏览 419回答 2
2回答

尚方宝剑之说

总结下答案:在shell脚本中加入exportNODE_PATH=/usr/local/lib/node_modules执行app时,先cd$APP_DIR在start_app方法中创建/var/lock/subsys/app文件,这样系统关机时才会调用app脚本的stop_app方法。

蛊毒传说

最好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脚本是避免出错的最好方法~
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript