windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务


一、问题描述及解决原理

把项目发布到windows服务器中,如tomcat工程不稳定,会有无故宕机的问题。如果通过程序无法解决,并且重启tomcat服务能够生效的话,可以做一个自动检测并重启的脚本。
脚本通过检测tomcat对应的工程链接(http或者https)是否已经正常启动,如果未正常启动,则重启tomcat服务。

二、安装curl环境

1、curl介绍

curl(全称Client URL):用于在命令行下运行的网络工具,用于与服务器进行通信。它支持多种协议,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP。 curl 支持SSL证书, HTTP POST, HTTP PUT, FTP上传, 基于HTTP表单的上传, 代理, HTTP/2, cookies, 用户+密码认证 (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), 文件传输修复, 隧道代理等等。

2、官网网站:https://curl.se/download.html

3、配置步骤

(1)下翻找到windwos版本,点击最新对应版本下载,我下载的是64位的

在这里插入图片描述

(2)点击进入后,下载对应架构的包。(比如我的是x86,就下载第一个)

在这里插入图片描述

(3)解压下载的压缩包,并将解压后的放在某个目录下

test

(4)添加环境变量

将curl目录下的bin添加到环境变量中
在这里插入图片描述

(5)打开命令行窗口验证,如下即成功。(命令行要打开一个新的)

etst

三、bat脚本

@echo off
setlocal enabledelayedexpansion

rem 链接
set URL="http://localhost:8080"
rem tomcat目录
set TOMCAT_HOME="E:\HMMJabTY\Tomcat8"
rem 关闭tomcat命令的路径
set CLOSE_CMD=%TOMCAT_HOME%\bin\shutdown.bat
rem 启动tomcat命令的路径
set START_CMD=%TOMCAT_HOME%\bin\start.bat
rem tomcat缓存目录
set TOMCAT_CACHE=%TOMCAT_HOME%\work
rem 日志文件的路径
set LOG_PATH=%TOMCAT_HOME%\check.log
rem 每次检测完后等待时间,再进行下一次检测,秒,若将程序部署到系统计划任务,可忽略
set TIME_WAIT=5

:loop
set httpcode=0
cd /d %TOMCAT_HOME%
echo %date% %time%
echo 'begin checking tomcat'

echo %date% %time% >>%LOG_PATH%
for /l %%i in (1,1,3) do (
	echo %%i
	for /f "delims=" %%r in ('curl -sL -w "%%{http_code}" %URL% -o /dev/null') do (
		set httpcode=%%r
		if !httpcode!==200 (
			GOTO :OUTFOR
		)
	)
)

:OUTFOR
echo %httpcode% >>%LOG_PATH%

if not %httpcode%==200 (
	echo close tomcat >>%LOG_PATH%
	call %CLOSE_CMD%
	timeout -t 5 >nul
	echo success to close tomcat >>%LOG_PATH%

	rd /S /Q %TOMCAT_CACHE%
	echo start tomcat >>%LOG_PATH%
	call %START_CMD%
	
	echo success to start tomcat
	echo success to start tomcat >>%LOG_PATH%
) else (
	echo the tomcat run is ok
	echo the tomcat run is ok >>%LOG_PATH%
)
timeout -t 3 >nul
rem 若将脚本程序部署到系统计划程序中,将以下代码可注释
timeout -t %TIME_WAIT% >nul
goto loop

四、扩展:脚本解析

脚本逻辑:该脚本会自动检测tomcat启动成功后的一个地址,(就是你tomcat启动成功后能访问的一个地址,你可以写一个测试地址,比如我这里是http://localhost:8080/),如果访问不到就会自动启动tomcat的start.bat文件

@echo off
# 在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是会显示出来的

setlocal enabledelayedexpansion
# 先了解一下批处理运行命令的机制:批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。
# 此语句含义:本地延迟扩展。延迟变量,全程延迟环境变量扩展。即不是先给该行变量赋值,而是在运行过程中给变量赋值。

rem 链接
# rem在bat脚本中为注释,执行脚本时会忽略此语句

set URL="https://localhost:8080"
# set指令用来设置变量

rem tomcat目录
set TOMCAT_HOME="E:\HMMJabTY\Tomcat8"
rem 关闭tomcat命令的路径
set CLOSE_CMD=%TOMCAT_HOME%\bin\shutdown.bat
rem 启动tomcat命令的路径
set START_CMD=%TOMCAT_HOME%\bin\start.bat
rem tomcat缓存目录
set TOMCAT_CACHE=%TOMCAT_HOME%\work
rem 日志文件的路径
set LOG_PATH=%TOMCAT_HOME%\check.log
rem 每次检测完后等待时间,再进行下一次检测,秒,若将程序部署到系统计划任务,可忽略
set TIME_WAIT=5

:loop
# 在Bat中有标签一词,跟C语言的函数类似。并且标签必须单独一行,并且以冒号开头。

set httpcode=0
cd /d %TOMCAT_HOME%
echo %date% %time%
echo 'begin checking tomcat'

echo %date% %time% >>%LOG_PATH%
# >>追加内容到文件末尾,而不会清除原有的内容主要将本来显示在屏幕上的内容输出到指定文件中指定文件如果不存在,则自动生成该文件


# 循环指令。这里需要了解两个关键字%i、%%i。%i这个关键字不能在bat中使用。只能再CMD命令下的for中使用,%%i是在bat的for中使用的指令。
# 规则:for、in和do是for语句的关键字,它们三个缺一不可。
# /l:表示以增量形式从开始到结束的一个数字序列
# (1,1,3):跟参数/l配合使用时,表示从1开始,以1递增,直到3。这就是循环3次。
# /f:主要用来处理文件和一些命令的输出结果。它可以提取文本文件的内容,进行逐行分析和处理
# delims=符号列表:切分字符串。没有指定符号则for /f语句以空格键或跳格键作为分隔符;如果制定了如“delims=,.”,则以逗号和句号作为被处理的字符串的分隔符号。

# curl:
# -s: 静默模式,在命令行中不会输出无关中间过程信息
# -L:自动重定向,有的网址是自动跳转的。使用-L参数,curl就会跳转到新的网址。
# -k:在发送https请求时,加上-k参数,否则会有如下证书的报错。如果是http请求,可以不加。
# -o:将返回内容输出到文件中。其中nul相当于linux中的/dev/null。功能就是一种特殊的虚拟设备,用于写入而不是读取。写入/dev/null的任何内容都会从操作系统中消失。
# -w:操作完成后在返回信息尾部追加指定的内容。完成请求传输后,使 curl 在 stdout 上显示自定义信息。%%{http_code}为返回的状态码。(状态码文档末尾有各种码值的解释)


for /l %%i in (1,1,3) do (
	echo %%i
	for /f "delims=" %%r in ('curl -sL -k %URL% -o nul -w "%%{http_code}"' ) do (
		set httpcode=%%r
		if !httpcode!==200 (
			GOTO :OUTFOR
		)
	)
)

:OUTFOR
echo %httpcode% >>%LOG_PATH%

# call:使用call命令,可以调用其它程序(包括批处理文件、其它执行命令)或标签。
# timeout -t 5:延时5s操作。>nul作用为屏幕不提示

if not %httpcode%==200 (
	echo close tomcat >>%LOG_PATH%
	call %CLOSE_CMD%
	timeout -t 5 >nul
	echo success to close tomcat >>%LOG_PATH%

# /S:表示除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
# /Q:安静模式,带/S 删除目录树时不要求确认。
	rd /S /Q %TOMCAT_CACHE%
	echo start tomcat >>%LOG_PATH%
	call %START_CMD%
	
	echo success to start tomcat
	echo success to start tomcat >>%LOG_PATH%
) else (
	echo the tomcat run is ok
	echo the tomcat run is ok >>%LOG_PATH%
)
timeout -t 3 >nul
rem 若将脚本程序部署到系统计划程序中,将以下代码可注释
timeout -t %TIME_WAIT% >nul
goto loop

使用tomcat8w启动

上述脚本是让tomcat使用cmd窗口启动,如果想用tomcat8w启动,如下图,则将脚本做微调可实现。
在这里插入图片描述

(1)编写restart.bat脚本

新建一个文件restart.bat,将以下脚本放在里边,并放到tomcat/bin目录下。

@echo off
net start tomcat8w

(2)修改START_CMD参数

将上述的启动tomcat命令的路径,start_cmd改为restart.bat


附:

状态码介绍:

curl爬取过程中,会返回一个http_code,下面是他们的意义信息
$http_code[“0”]=“Unable to access”;
$http_code[“100”]=“Continue”;
$http_code[“101”]=“Switching Protocols”;
$http_code[“200”]=”OK”;
$http_code[“201”]=”Created”;
$http_code[“202”]=”Accepted”;
$http_code[“203”]=”Non-Authoritative Information”;
$http_code[“204”]=”No Content”;
$http_code[“205”]=”Reset Content”;
$http_code[“206”]=”Partial Content”;
$http_code[“300”]=”Multiple Choices”;
$http_code[“301”]=”Moved Permanently”;
$http_code[“302”]=”Found”;
$http_code[“303”]=”See Other”;
$http_code[“304”]=”Not Modified”;
$http_code[“305”]=”Use Proxy”;
$http_code[“306”]=”(Unused)”;
$http_code[“307”]=”Temporary Redirect”;
$http_code[“400”]=”Bad Request”;
$http_code[“401”]=”Unauthorized”;
$http_code[“402”]=”Payment Required”;
$http_code[“403”]=”Forbidden”;
$http_code[“404”]=”Not Found”;
$http_code[“405”]=”Method Not Allowed”;
$http_code[“406”]=”Not Acceptable”;
$http_code[“407”]=”Proxy Authentication Required”;
$http_code[“408”]=”Request Timeout”;
$http_code[“409”]=”Conflict”;
$http_code[“410”]=”Gone”;
$http_code[“411”]=”Length Required”;
$http_code[“412”]=”Precondition Failed”;
$http_code[“413”]=”Request Entity Too Large”;
$http_code[“414”]=”Request-URI Too Long”;
$http_code[“415”]=”Unsupported Media Type”;
$http_code[“416”]=”Requested Range Not Satisfiable”;
$http_code[“417”]=”Expectation Failed”;
$http_code[“500”]=”Internal Server Error”;
$http_code[“501”]=”Not Implemented”;
$http_code[“502”]=”Bad Gateway”;
$http_code[“503”]=”Service Unavailable”;
$http_code[“504”]=”Gateway Timeout”;
$http_code[“505”]=”HTTP Version Not Supported”;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/54040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解Angular、React 和 Vue.js的区别

前端开发人员在开始一个新项目时首先要回答的问题是:我应该选择哪个框架? 哪个框架更适合我的需求? 在本文中,我们将向您快速概述当前使用的最常见的前端框架,旨在帮助您选择最能满足您需求的框架。这些框架是 Angular…

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

PHP8的常量-PHP8知识详解

常量和变量是构成PHP程序的基础,在PHP8中常量的这一节中,主要讲到了定义常量和预定义常量两大知识点。 一、定义常量 定义常量也叫声明常量。在PHP8中,常量就是一个标识符(名字),一旦定义(声明&…

Java常用API:Math、Syetem、Runtime、BigDecimal

Math类 //目标:了解下Nath类提供的常见方法。 // 1、public static int abs(int a):取绝对值(拿到的结果一定是正数) //public static double abs(double a) system.out.println(Math.abs(-12)); // 12 system.out.println(Math.abs(123));// 123 system…

VScode远程不用再输入密码操作

安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。(一般会在这个目录) 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…

华为数通HCIA-网络参考模型(TCP/IP)

网络通信模式 作用:指导网络设备的通信; OSI七层模型: 7.应用层:由应用层协议(http、FTP、Telnet.)为应用程序产生对应的数据; 6.表示层:将应用层产生的数据转换成网络设备看得懂…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇: 《STM32 USB使用记录:HID类设备(前篇)》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

Shell脚本实现分库分表操作

目录 一,分库备份 二,分库操作 三,分库分表备份 四,备份还原 一,分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…

【图论】BFS中的最短路模型

算法提高课笔记 目录 单源最短路迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 多源最短路矩阵距离题意思路代码 双端队列BFS电路维修题意思路代码(加了注释) BFS可以解决边权为1的最短路问题,下面是相关例题 单源…

python-面向对象.继承

继承 1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print("-----吃-------") def drink(self): print("-----喝…

【100天精通python】Day21:文件及目录操作_文件的权限处理和批量处理

目录 专栏导读 1. 文件的权限处理 1.1 查询文件权限 1.2 修改文件权限 2 文件的批量处理 2.1 使用os模块和os.listdir()函数 2.2 使用glob模块 2.3 使用shutil模块 2.3.1 批量复制文件 2.3.2 批量移动文件 2.3.3 批量删除文件 2.3.4 批量创建目录 专栏导读 专栏订阅…

聊聊拉长LLaMA的一些经验

Sequence Length是指LLM能够处理的文本的最大长度,越长,自然越有优势: 更强的记忆性。更多轮的历史对话被拼接到对话中,减少出现遗忘现象 长文本场景下体验更佳。比如文档问答、小说续写等 当今开源LLM中的当红炸子鸡——LLaMA…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

2023 蓝桥杯真题B组 C/C++

https://www.dotcpp.com/oj/train/1089/ 题目 3150: 蓝桥杯2023年第十四届省赛真题-冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金 属 O…

价值 1k 嵌入式面试题-计算机网络 OSI

开门见山 请讲下 OSI 各层协议的主要功能? 常见问题 回答不系统回答不确切无法和实际网络协议做关联对应 答题思路 OSI 代表了开放互联系统中信息从一台计算机的一个软件应用流到另一个计算机的另一个软件应用的参考模型 OSI 包含 7 层,每一层负责特…

51单片机学习--串口通信

首先需要配置寄存器: 下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可 void Uart_Init(void) //4800bps11.0592MHz {PCON | 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率TMOD & 0x0F…

tinkerCAD案例:29. 摇头娃娃

Research Your Favorite Bobblehead 摇头娃娃 Project Overview: 项目概况: Design and create your favorite Minecraft 3D bobble head. All you need is a computer, 3D printer, spring and your creativity to your favorite Minecraft character in the for…

1、Hadoop3.x 从入门到放弃,第一章:概念

Hadoop3.x从入门到放弃,第一章:概念 一、什么是大数据 1、主要解决什么 大数据主要解决:海量数据的“采集”、“存储” 和 "分析计算" 问题2、大数据特点 1> Volume 大量 2> velocity 高速 3> variety 多样性数据分为…

网络层:IP协议/Mac协议

IP协议 主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统 称; IP 目标网络(前半部分) 目标主机(后半部分) IP层的核心:IP地址定位主机(定…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中,IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据,而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题,数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…
最新文章