编写tomcat自启动脚本引发的shell模式思考

一、背景说明

shell模式的不同往往代表其加载的文件不同或加载的文件优先级,有一次需要通过war包部署jenkins来做持续集成测试,当下载完war包并将其放置在tomcat下后,可以正常运行,但是tomcat不能随系统启动而运行,随机编写了一个简单的启动脚本,但是在运行过长当中碰到了一些与shell模式相关的问题,为了清晰的说明场景,下面按照jenkins部署、脚本编写、出现的问题以及解决方式的顺序来说明

二、场景呈现

2.1.war包部署jenkins

以往都是以docker的方式来部署jenkins,但是有一次需要在jenkins平台使用docker工具来构建镜像,无法在jenkins容器内部安装docker(能安装clinet但是daemon启动不了,暂时还没找到解决方式),所以只能宿主机安装jenkins了
jdk安装
安装步骤就略了,主要是设置好环境变量
vi /etc/profile

JAVA_HOME=/usr/local/jdk

JRE_HOME=$JAVA_HOME/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar

export JAVA_HOME JRE_HOME PATH CLASSPATH

下载tomcat以及jenkins.war
tar zvxf apache-tomcat-8.5.53.tar.gz && mv apache-tomcat-8.5.53 /usr/local/tomcat
rm -Rf /usr/local/tomcat/webapps/*
mv jenkins.war /usr/local/tomcat/webapps/ROOT.war
启动tomcat
/usr/local/tomcat/bin/startup.sh
停止tomcat
/usr/local/tomcat/bin/shutdown.sh
访问http://ip:8080

2.2.脚本编写

下面是采用的旧版系统服务脚本
cat jenkins

#!/bin/bash 

#######该脚本用于自启动tomcat程序##################################
#######脚本名字这里取名叫jenkins,尽量不要使用tomcat###############
#######因为本脚本里在做判断的时候过滤的是tomcat这个字符############
#######如果脚本名也使用tomcat很容易在下面脚本中prob值出现错误######

#######将其加入chkconfig#####
# chkconfig: 2345 80 80
# description: a java application web server

#######脚本中涉及到其他脚本,调用时处于非交互非登录shell状态######
#######需要读取全局环境配置#######################################
source /etc/profile

prob=$(ps -ef|grep tomcat | grep -v grep | wc -l)

start () {
    [ ${prob} -eq 0 ] && bash /usr/local/tomcat/bin/startup.sh || { echo "tomcat is running";exit 1; }
}
stop () {
    [ ${prob} -ge 1 ] && bash /usr/local/tomcat/bin/shutdown.sh || { echo "tomcat is not running";exit -1; }
}
    case $1 in
    starts|START)
        start
        ;;
    stop|STOP)
        stop
        ;;
    restart|RESTART)
        stop
        sleep 2
        start
        ;;
    *)
        echo -e "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
    esac

chmod +x jenkins && cp -ap jenkins /etc/init.d/jenkins && chkconfig --add jenkins
chkconfig jenkins on
启动tomcat
service jenkins start
停止tomcat
service jenkins stop
重启tomcat
service jenins restart

2.3.问题

问题一:
在执行脚本的时候有时候会报错

Could not contact [localhost:[8005]]. Tomcat may not be running

解决办法:
假设jdk目录为/usr/local/jdk
sed -i '/securerandom.source/s/./urandom/random/g' /usr/local/jdk/jre/lib/security/java.security
重启tomcat

问题二:
观察一下上面的脚本,有一个source /etc/profile,这里为什么要加上这一条命令,如果不加会产生什么后果,经测试,不加运行脚本会报错,错误是找不到java环境变量,但是事实上已经在/etc/profile里设置了jdk环境变量了,那么为什么会报错呢?
解决办法:
在脚本中加上/etc/profile来强制读取/etc/profile文件,或者在脚本开头加上解释器参数--login,如下所示

#!/bin/bash --login  

这样在执行脚本的时候就强制成login shell模式,该模式会第一时间读取文件/etc/profile
那么具体bash有多少种模式呢,每种模式是遵循哪一种规则呢,其作用是什么呢?后面会专门用一篇文章来学习其shell模式