linux 环境中,一般都使用 shell 脚本来做应用的启动控制。
在写脚本的时候,首先,先要确定在执行脚本之前,是不是需要做些什么准备工作。
第一步,假定是用 windows 系统作为开发机,那么如果是直接把 shell 脚本复制到 linux 机器上,那么就要首先使用 dos2unix 命令把 win 风格的 shell 文件转为 linux 风格的了。
dos2unix /path/to/*.sh
第二步,如果要记录日志,那么要给存放日志的文件夹递归地添加读写权限
chmod -R 664 /path/logs
第三步,要确定脚本是可执行文件,否则要添加上可执行权限
chmod +x /path/filename
到了这里,执行脚本的前置工作就已经完成了。虽然还没有开始写脚本。。。那就开始写脚本吧
第零步,在文件的最上面,表明文件需要用 bash 执行
#!/bin/bash
第一步,确定当前用户是否有相应应用的正确环境变量配置,如果没有,可以先在文件头部添加上
export NODE_ENV='/usr/local/bin'
export PATH=$NODE_ENV:$PATH
这样来将应用的位置信息临时添加到环境变量中,便于后面直接使用 node 而不是使用完整路径启动路径
也可以首先添加到 /etc/profile 中,然后使用
source /etc/profile
确保环境变量的修改生效。
第二步,声明应用所在的文件夹,声明应用的入口文件
APP_HOME=/path/to/app_home
APP_MAIN=$APP_HOME"/app.js"
第三步,检查日志文件目录是否存在,不存在的话要新建
APP_LOG=/path/to/logPath
if [ ! -d $APP_LOG ]; then
mkdir $APP_LOG
fi
第四步,检查应用是否已经启动
nodePids=0
nodePids=`ps -ef | grep "node $APP_MAIN" | grep -v grep | awk '{print $2}'`
第五步,如果应用已经启动,就全都关掉
if [ $nodePids -ne 0 ]; then
for id in $nodePids
do
kill -9 $id
done
if [ $? -ne 0 ]; then
echo "kill $id fail"
return 1
fi
fi
第六步,启动应用
nohup node $APP_MAIN > $APP_LOG/nohup.log 2>&1 &
第七步,检查应用是否成功启动
pids=0
getPids(){
pids=`ps -ef | grep "node $APP_MAIN" | grep -v grep | awk '{print $2}'`
}
getPids
if [ $pids -ne 0 ]; then
echo "app start success!"
fi
总结:启动一个应用,要考虑很多情况:脚本是否跨系统?脚本是否能执行?环境变量是否已经注册?日志文件夹是否有读写权限?应用是否已经启动过(会占据端口资源导致无法直接启动)?旧应用是否没有杀死?新应用是否真的启动起来了?这些全都考虑到了,才不会在上线时候遇到问题。