构建应用启动脚本的正确思路

Posted lswit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建应用启动脚本的正确思路相关的知识,希望对你有一定的参考价值。

 

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

总结:启动一个应用,要考虑很多情况:脚本是否跨系统?脚本是否能执行?环境变量是否已经注册?日志文件夹是否有读写权限?应用是否已经启动过(会占据端口资源导致无法直接启动)?旧应用是否没有杀死?新应用是否真的启动起来了?这些全都考虑到了,才不会在上线时候遇到问题。

以上是关于构建应用启动脚本的正确思路的主要内容,如果未能解决你的问题,请参考以下文章

即使脚本使用“开始”,使用 Maven exec 插件启动 Windows 批处理脚本也会阻止构建

链接 package.json 脚本以启动 Express 服务器和 Vue 应用程序

如何在启动时自动构建 AHK 脚本?

Matlab 编译器和启动脚本

如何在 npm 脚本中使用 nodemon 来构建和启动脚本?

sh 用于构建和启动Google Fuchsia的BASH脚本