tomcat8.5启动脚本:
原始脚本如下所示
[root@devops01-web-53 scripts]# cat Tomcat-init #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tomcat-server daemon # Description: tomcat-server daemon ### END INIT INFO # # chkconfig: - 95 15 # description: Tomcat start/stop/status script #Location of JAVA_HOME (bin files) export JAVA_HOME= #Add Java binary files to PATH export PATH=$JAVA_HOME/bin:$PATH #CATALINA_HOME is the location of the configuration files of this instance of Tomcat CATALINA_HOME=/usr/local/tomcat #TOMCAT_USER is the default user of tomcat TOMCAT_USER=www #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=20 tomcat_pid() { echo `ps -ef | grep $CATALINA_HOME/ | grep -v grep | tr -s " "|cut -d" " -f2` } start() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else echo -e "\e[00;32mStarting tomcat\e[00m" if [ `user_exists $TOMCAT_USER` = "1" ]; then su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh else $CATALINA_HOME/bin/startup.sh fi status fi return 0 } status() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mStoping Tomcat\e[00m" $CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n"; sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } user_exists() { if id -u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0 [root@devops01-web-53 scripts]#
tomcat启动的时候看不出异常,关闭的时候回报错类似:
SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running.
[root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh Using CATALINA_BASE: /application/tomcat-sbce Using CATALINA_HOME: /application/tomcat-sbce Using CATALINA_TMPDIR: /application/tomcat-sbce/temp Using JRE_HOME: /usr/java/jdk Using CLASSPATH: /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar Jul 26, 2018 10:58:18 AM org.apache.catalina.startup.Catalina stopServer SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running. Jul 26, 2018 10:58:18 AM org.apache.catalina.startup.Catalina stopServer SEVERE: Catalina.stop: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:211) at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:497) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
即为8005端口未运行,使用命令netstat -ant 发现 没有找到8005端口
[root@devops01-web-53 scripts]# netstat -lntup|grep java tcp 0 0 :::8009 :::* LISTEN 10373/java tcp 0 0 :::8080 :::* LISTEN 10373/java
解决办法:
修改$JAVA_HOME/jre/lib/security/Java.security 文件中 securerandom.source 配置项:
将 securerandom.source=file:/dev/random 修改为: securerandom.source=file:/dev/urandom(网上查询的结果,我改完这个就可以了,下面的未测试) 如果,仍然不生效,则修改为: file:/dev/./urandom
实战如下:
[root@devops01-web-53 scripts]# vim /usr/java/jdk/jre/lib/security/java.security securerandom.source=file:/dev/random 修改为 securerandom.source=file:/dev/urandom
再次启动tomcat就有8005端口了,提示不是立刻就有8005端口,要等一小会才会有。
[root@devops01-web-53 scripts]# netstat -lntup|grep java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 10615/java tcp 0 0 :::8009 :::* LISTEN 10615/java tcp 0 0 :::8080 :::* LISTEN 10615/java
验证8005端口延时启动过程:
[root@szxjdw01-web-27 ~]# ps -ef|grep java root 6578 6202 0 11:02 pts/1 00:00:00 grep java [root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/startup.sh Using CATALINA_BASE: /application/tomcat-sbce Using CATALINA_HOME: /application/tomcat-sbce Using CATALINA_TMPDIR: /application/tomcat-sbce/temp Using JRE_HOME: /usr/java/jdk Using CLASSPATH: /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar Tomcat started. [root@szxjdw01-web-27 ~]# ps -ef|grep java root 6588 1 99 11:02 pts/1 00:00:10 /usr/java/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat-sbce/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat-sbce -Dcatalina.home=/application/tomcat-sbce -Djava.io.tmpdir=/application/tomcat-sbce/temp org.apache.catalina.startup.Bootstrap start root 6610 6202 0 11:02 pts/1 00:00:00 grep java [root@szxjdw01-web-27 ~]# netstat -lntup|grep java tcp 0 0 :::8009 :::* LISTEN 6588/java tcp 0 0 :::8080 :::* LISTEN 6588/java [root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh Using CATALINA_BASE: /application/tomcat-sbce Using CATALINA_HOME: /application/tomcat-sbce Using CATALINA_TMPDIR: /application/tomcat-sbce/temp Using JRE_HOME: /usr/java/jdk Using CLASSPATH: /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar Jul 26, 2018 11:02:48 AM org.apache.catalina.startup.Catalina stopServer SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running. Jul 26, 2018 11:02:48 AM org.apache.catalina.startup.Catalina stopServer SEVERE: Catalina.stop: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:211) at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:497) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495) [root@szxjdw01-web-27 ~]# netstat -lntup|grep java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 6588/java tcp 0 0 :::8009 :::* LISTEN 6588/java tcp 0 0 :::8080 :::* LISTEN 6588/java [root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh Using CATALINA_BASE: /application/tomcat-sbce Using CATALINA_HOME: /application/tomcat-sbce Using CATALINA_TMPDIR: /application/tomcat-sbce/temp Using JRE_HOME: /usr/java/jdk Using CLASSPATH: /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar [root@szxjdw01-web-27 ~]# netstat -lntup|grep java
第一次修改脚本为如下:如下4行必须修改为自己的环境
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$PATH
CATALINA_HOME=/application/tomcat-sbce
TOMCAT_USER=sysadmin
[root@devops01-web-53 application]# cat /etc/init.d/tomcat-sbce #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tomcat-server daemon # Description: tomcat-server daemon ### END INIT INFO # # chkconfig: - 95 15 # description: Tomcat start/stop/status script #Location of JAVA_HOME (bin files) export JAVA_HOME=/usr/java/jdk #Add Java binary files to PATH export PATH=$JAVA_HOME/bin:$PATH #CATALINA_HOME is the location of the configuration files of this instance of Tomcat CATALINA_HOME=/application/tomcat-sbce #TOMCAT_USER is the default user of tomcat TOMCAT_USER=sysadmin #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=20 [ -f /etc/init.d/functions ] && . /etc/init.d/functions actions(){ RETVAL=$? if [ $RETVAL -eq 0 ];then action "Tomcat is $1" /bin/true else action "Tomcat is $1" /bin/false fi } tomcat_pid() { echo `ps -ef | grep $CATALINA_HOME | grep -v grep | tr -s " "|cut -d" " -f2` } start() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else echo -e "\e[00;32mStarting tomcat\e[00m" if [ `user_exists $TOMCAT_USER` = "1" ]; then su - $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 & else $CATALINA_HOME/bin/startup.sh fi status actions Started fi return 0 } status() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mStoping Tomcat\e[00m" su - $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 & let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n"; action stopped sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } user_exists() { if id -u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0
验证脚本:root下面正常;syadmin下面start正常,stop不正常;其他普通账号sysadm下面运行也有问题
脚本需要达到的目的是:
脚本在root下面可以正常运行,在设置的普通账号sysadmin可以运行,但是在非root账号非设置的sysadmin账号下面提示没有权限。
第二次优化脚本如下:
#!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tomcat-server daemon # Description: tomcat-server daemon ### END INIT INFO # # chkconfig: - 95 15 # description: Tomcat start/stop/status script #Location of JAVA_HOME (bin files) export JAVA_HOME=/usr/java/jdk #Add Java binary files to PATH export PATH=$JAVA_HOME/bin:$PATH #CATALINA_HOME is the location of the configuration files of this instance of Tomcat CATALINA_HOME=/application/tomcat-sbce #TOMCAT_USER is the default user of tomcat TOMCAT_USER=sysadmin #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=5 [ -f /etc/init.d/functions ] && . /etc/init.d/functions actions(){ RETVAL=$? if [ $RETVAL -eq 0 ];then action "Tomcat is $1" /bin/true else action "Tomcat is $1" /bin/false fi } tomcat_pid() { echo `ps -ef | grep $CATALINA_HOME | grep -v grep | tr -s " "|cut -d" " -f2` } start() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else #echo -e "\e[00;32mStarting tomcat\e[00m" #if [ `user_exists $TOMCAT_USER` = "1" ]; then if [ "$USER" = "root" ]; then echo -e "\e[00;32mStarting tomcat\e[00m" su - $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 & #status actions Started elif [ "$USER" = "$TOMCAT_USER" ];then echo -e "\e[00;32mStarting tomcat\e[00m" $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 & #status actions Started else echo -e "User must be root or $TOMCAT_USER" #$CATALINA_HOME/bin/startup.sh exit 2 fi fi return 0 } status() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ]; then [ "$USER" = "root" ] && { echo -e "\e[00;31mStoping Tomcat\e[00m" su - $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 & } [ "$USER" = "$TOMCAT_USER" ] && { echo -e "\e[00;31mStoping Tomcat\e[00m" $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 & } [ "$USER" != "root" -a "$USER" != "$TOMCAT_USER" ] && { echo -e "User must be root or $TOMCAT_USER" exit 2 } let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n"; action stopped sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } :<<EOF user_exists() { if id -u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } EOF case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0
经过测试此启动脚本ok
此脚本经过使用过程中发现有bug,特意优化一下
第二次优化脚本如下:
tomcat-sbce脚本如下:
export JAVA_HOME、export PATH、CATALINA_HOME、TOMCAT_USER
其中CATALINA_HOME=/application/tomcat-sbce/目录后面一定要带/否则,tomcat_pid匹配的时候不精确,比如有两个实例tomcat-sbce和tomcat-sbce-h5,要确定每个pid进程的时候,使用ps -ef|grep /application/tomcat-sbce可以查看两个进程,不精确,所以要带完整路径ps -ef|grep /application/tomcat-sbce/才精确。
变化的只有这4个变量。
[root@devops01-web-53 logs]# cat /etc/init.d/tomcat-sbce #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tomcat-server daemon # Description: tomcat-server daemon ### END INIT INFO # # chkconfig: - 95 15 # description: Tomcat start/stop/status script #Location of JAVA_HOME (bin files) export JAVA_HOME=/usr/java/jdk #Add Java binary files to PATH export PATH=$JAVA_HOME/bin:$PATH #CATALINA_HOME is the location of the configuration files of this instance of Tomcat #CATALINA_HOME must be followed by /,Because you can use ps-ef |grep to match exactly CATALINA_HOME=/application/tomcat-sbce/ #TOMCAT_USER is the default user of tomcat TOMCAT_USER=sysadmin #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=5 [ -f /etc/init.d/functions ] && . /etc/init.d/functions actions(){ RETVAL=$? if [ $RETVAL -eq 0 ];then action "Tomcat is $1" /bin/true else action "Tomcat is $1" /bin/false fi } tomcat_pid() { echo `ps -ef | grep $CATALINA_HOME | grep -v grep | tr -s " "|cut -d" " -f2` } start() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else if [ "$USER" = "root" ]; then echo -e "\e[00;32mStarting tomcat\e[00m" su - $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 & actions Started elif [ "$USER" = "$TOMCAT_USER" ];then echo -e "\e[00;32mStarting tomcat\e[00m" $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 & actions Started else echo -e "User must be root or $TOMCAT_USER" exit 2 fi fi return 0 } status() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ]; then [ "$USER" = "root" ] && { echo -e "\e[00;31mStoping Tomcat\e[00m" su - $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 & } [ "$USER" = "$TOMCAT_USER" ] && { echo -e "\e[00;31mStoping Tomcat\e[00m" $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 & } [ "$USER" != "root" -a "$USER" != "$TOMCAT_USER" ] && { echo -e "User must be root or $TOMCAT_USER" exit 2 } let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n"; action stopped sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0