crontab 定时检测 Tomcat 状态脚本实现及注意事项

news2024/12/29 9:18:34

背景

Jenkins 所在的 Tomcat 总是莫名挂掉,虽然任务配置了 NOKILLME 参数,而且并不是总是发生在编译完成后才挂的。怀疑是机器资源不足导致的,没有依据。最简单的办法是创建一个定时任务,检测 Tomcat 状态,不见了就拉起它。

本文记录这个简单的过程,很简单的一个脚本,里面确包含着 Linux shell 的几个基本知识点,一起温故一下。

拉起脚本

编写拉起脚本,平时写了很多 stop.sh 脚本,随便找到一个参考,拷贝过来的,命名为 pull-tomcat.sh。 Tomcat 的特殊关键字是进程启动的 class 类名称 Bootstrap ,编写完整脚本如下:

#!/bin/sh
basePath=$(cd `dirname $0`; pwd)
scriptName=$(basename "$0")
cd $basePath
cd ..
dataDir=`pwd`
date=`echo $(date "+%m%d%H%M%S")`
tomcatInfo=`ps -ef|grep -w Bootstrap|grep -v grep|grep -v "$scriptName"|awk '{print $2}'`
echo $date","$tomcatInfo

if [ "$tomcatInfo" == "" ]; then
    echo 'Tomcat is missing and start it.'
    cd /opt/apache-tomcat-9.0.82/bin
    sh startup.sh
fi

脚本很简单,但是有几个关键点:

  1. 第一行脚本编辑器设置必须正确,区分不同操作系统默认生成的 shell 文件该行不一样。
  2. 使用 ps 查看进程时,需要考虑脚本的执行方式,为了保证过滤结果正确,需要过滤掉当前脚本自己 grep -v "$scriptName"
  3. crontab 定时器执行时依赖环境变量和直接执行脚本或者在命令行执行命令不一样,所以不能环境变量 PATH 路径下的命令,如 jps ,否则会导致 crontab 命令执行失败。
  4. if 分支如果编写 else 分支,则该分支里面必须包含语句,否则会报错。这点跟 Java 不一样,Java 可以包含空分支的。

脚本解释器问题

MacOs 下用 IDEA 创建 .sh 后缀的文件时,自动会在第一行加上解释器信息为:

#!/sh

但是当放到 Linux 系统下,通过 ./文件名的方式执行时,会报错误:

-bash: ./test.sh: /sh: 坏的解释器: 没有那个文件或目录

注意事项:

  1. ./文件名的方式执行时,必须有执行权限,否则会报“权限不够”的错误,执行失败;且会以开头第一行设置的 Shell 解释器进行执行。Mac 下默认的解释器是 #!/sh,在 Linux 下应该设置为 #!/bin/bash
  2. sh 文件名的方式,即使没有执行权限,也能执行。通过子进程的方式执行,而子进程的执行路径字段为当前脚本文件路径,且会被 grep 过滤器留下,因此得到的结果不准确。
    在这里插入图片描述

上图是目标主机上在脚本中执行 ps -ef|grep -w Bootstrap|grep -v grep 的结果,里面包含了当前脚本名称。诡异的是,这种情况还跟机器有关,以前都没有碰到过这种情况。可能跟 shell 解释器的什么特殊配置有关吧。

cron 环境变量问题

jps 命令,当 crontab 定时执行时,报异常,命令不存在。脚本中最初想用 jps 命令查找 Bootstrap 进程的,但是定时调度时总是报命令不存在。

猜测是 /root/.bash_profile 里面没有配置 JAVA_HOME/binPATH,但是配置后,定时任务执行时依旧报这个错误。

编写定时任务,执行 crontab -e 添加一条每隔 10分钟执行一次的脚本,并将脚本输出内容写入某文件:

*/10 * * * * /home/pull-tomcat.sh >> /home/pull-tomcat.log

启示录

最后再汇总一下 Shell 的基本知识:

  1. 以后编写 stop 脚本时,用 ps 查找目标进程时,需要考虑过滤掉当前脚本名称。
  2. 第一行的脚本默认解释器,当使用 ./文件名执行时会生效,所以必须保证对应系统中存在指定的解释器。
  3. 环境变量问题,搞不清楚环境变量,使用命令时写全路径。
  4. crontab 定时任务添加时,可以追加命令执行结果到某个文件,便于查看任务执行情况。cron 自身的调度日志只能看到调度过程,而看不到脚本执行内容。Linux 下 cron 语法是 「分 时 日 月 周」五部分,跟 Quartz 的调度表达式少了头尾的 分和年。
  5. crontab 服务名称是 crond ,修改定时任务后,任务配置自动生效。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的崩溃。。想鼠??!

身为程序员哪一个瞬间让你最奔溃? 某天一个下午崩溃产生。。。 一个让我最奔溃的瞬间是关于一个看似无害的拼写错误。我当时正在为一个电子商务网站添加支付功能,使用了一个第三方支付库。所有的配置看起来都正确,代码也没有报错,…

prometheus|云原生|grafana-9.4.3版本的主题更改

一, grafana-9.4.3版本的主题更改 grafana-9.4.3版本应该是目前比较高的版本了,但不知道是什么原因,grafana的主题界面并不多,只有暗色,亮色和系统色三种 配置管理----首选项里可以看到 亮色: 暗色&…

网络层(IP协议)

文章目录 网络层IP协议IP协议报头32位源IP地址和目的IP地址:为了解决IP地址不够用的情况 IP地址管理子网掩码特殊IP 路由选择(简介) 网络层 网络层主要负责地址管理和路由选择.代表协议就是IP协议. IP协议 IP协议报头 4位版本: 4: 表示IPv4 ; 6: 表示IPv6 4位首部长度: 描述…

vscode导入STM32CubeIDE工程文件夹未定义警告清除方法

0 前言 在我们使用vscode去编辑STM32CubeIDE的工程文件时,经常会出现一些类型未定义、头文件路径无效的问题,无法正常使用且非常影响观感。本文介绍如何设置vscode导入的STM32CubeIDE配置文件,解决这一问题。 1 vscode导入STM32CubeIDE工程…

如何设置图像的尺寸大小?用它提高效率100%

调整图片像素和大小是一种常见的图像处理操作,可以根据需要改变图片的宽度和高度,在许多场景中都很有用,如网页设计、图像制作、打印和展示等,想要准确的对图片尺寸修改就需要用到专业的修改图片大小工具,下面就详细介…

今年的校招薪资真的让人咋舌!

秋招接近尾声,各大公司基本也陆续开奖了。这里整理了部分公司的薪资情况,数据来源于 OfferShow 和牛客网。 ps:爆料薪资的几乎都是 211 和 985 的,并不是刻意只选取学校好的。另外,无法保证数据的严格准确性。 淘天 …

MYSQL基础知识之【数据类型】

文章目录 前言标题一数值类型日期和时间类型字符串类型后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错…

基于IDEA+MySQL+SSM开发的证券交易结算系统

基于SSM的证券交易结算系统 项目介绍💁🏻 网上交易克服了传统现场交易的弊端,用户通过网上交易可以随时、随地进行交易;同时,网上交易具有速度快、透明度高、成本低、安全性高等优点,与传统的基于营业部的证…

tinyViT论文笔记

论文:https://arxiv.org/abs/2207.10666 GitHub:https://github.com/microsoft/Cream/tree/main/TinyViT 摘要 在计算机视觉任务中,视觉ViT由于其优秀的模型能力已经引起了极大关注。但是,由于大多数ViT模型的参数量巨大&#x…

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工蜂鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

力软vue前端开发:使用params跳转传参404问题解决

问题描述 this.$router.push({ name: page, query: { id: 001 } }) // 根据路由名称 query 的方式跳转传参 使用query传参时,参数会拼接在链接后,点击搜索条件链接参数也还在。用户需要重新进入搜索页面。 所以,使用nameparams进行传参。参…

快速压缩:迅速减小PDF文件大小的步骤与技巧

虽然png图片格式是一种无损压缩格式,但是png图片的内存大小也是比较大的,而且兼容性上也没有jpg图片好,许多平台推荐的也都是jpg格式,所以当我们需要把png转jpg格式的时候,就需要用到图片格式转换器,今天推…

sql查询优化实际案例

1、第一步:sql优化 正对于海量数据的查询优化,且外键关联比较多的情况,通常情况是下sql层面的优化,有些时候是由于sql不合理的编写导致,如尽量少使用sql内查询等 如:避免使用 left join (select * form …

代码随想录算法训练营第五十八天|739. 每日温度、496. 下一个更大元素 I

第十章 单调栈part01 739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用…

数据结构与算法编程题21

判别两棵树是否相等。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1typedef struct BiNode {ElemType data;BiNode* lchild, * rchild; }BiNode, * BiTree;bool Create_tree(BiTree&a…

斐讯K2结合Padavan实现锐捷认证破解方法

前言 众所周知&#xff0c;校园网在传统模式下是不能直接插路由使用的&#xff0c;但苦于校园网只能连接一台设备的烦恼&#xff0c;不得不“另辟蹊径”来寻求新的解决路径&#xff0c;这不&#xff0c;它来了&#xff0c;它来了&#xff0c;它带着希望走来了。 本文基于斐讯…

gobuster扫描工具使用教程(简单上手)

gobuster扫描工具使用教程 gobuster是干嘛用的? Gobuster是一个用于网络渗透测试的工具。它主要用于在Web应用程序中发现隐藏的内容或目录枚举&#xff0c;可以扫描子域名以及Web目录&#xff0c;寻找可能存在的漏洞。这个工具使用Go语言编写&#xff0c;具备优异的执行效率…

排序算法-----基数排序

目录 前言 基数排序 算法思想 ​编辑 算法示例 代码实现 1.队列queue.h 头文件 2.队列queue.c 源文件 3.主函数&#xff08;radix_sort实现&#xff09; 算法分析 前言 今天我想把前面未更新完的排序算法补充一下&#xff0c;也就是基数排序的一种&#xff0c;这是跟…

每日一题 1457. 二叉树中的伪回文路径(中等,DFS)

一句话&#xff0c;深度搜索所有路径&#xff0c;判断路径是否伪回文 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right clas…

leetCode 226.翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 示例 1: 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…