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

背景

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.mfbz.cn/a/187260.html

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

相关文章

京东家用电器商品电子说明书在哪里能找到怎么查看产品电子说明书?草柴返利APP如何查询领取京东优惠券拿京东购物返利?

京东商品电子说明书是一种便捷、高效的说明工具,为消费者了解和使用商品提供了重要帮助。京东商品电子说明书是一种以电子文档、图文、视频的形式提供的商品使用说明书。它通常由商家上传至京东平台,以供消费者在购买商品后下载查看。与传统的纸质说明书…

用 VirtualBox 安装 OpenWrt 等 Linux 系统,无法启动的解决办法

用 VirtualBox 安装 OpenWrt 等 Linux 系统,无法启动的解决办法 最近新买了台联想小新 Pro 14 2023 锐龙版,因为有 32GB 的运行内存,所以想安装虚拟机以充分发挥。一开始使用 Hyper-V 来安装可以正常使用,但是后面想使用 Virtual…

【Redis基础】Redis安装及管理详细教程

✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! 1,UBuntu安装Redis 1,使用su命令切换到root用户 su2,使用se…

小程序项目:node+vue基于微信小程序的校园盲盒小程序的设计与实现

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…

openEuler20.03学习01-创建虚拟机

赶个时髦,开始学习openEuler 20.03 (LTS-SP3) 操作系统iso下载地址:https://repo.openeuler.openatom.cn/openEuler-20.03-LTS-SP3/ISO/x86_64/openEuler-20.03-LTS-SP3-x86_64-dvd.iso 公司有现成的vmware环境,创建虚拟机i测试&#xff0c…

Rust UI开发(二):iced中如何为窗口添加icon图标

注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇: Rust UI开发:使用iced构建UI时,如何在界面显示中文字符 本篇是系…

webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍

计算一个脉冲响应和输入信号的卷积,除了使用原始的时域卷积以外,还有如下方法: FFT卷积的方法:对输入信号(长度M)和脉冲响应(长度N)分别补零到K(K>MN-1),…

电子学会C/C++编程等级考试2021年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头…

内网穿透的应用-如何在本地安装Flask,以及将其web界面发布到公网上并进行远程访问

轻量级web开发框架:Flask本地部署及实现公网访问界面 文章目录 轻量级web开发框架:Flask本地部署及实现公网访问界面前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何…

图解Kafka适用场景,全网最全!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

STM32F103x TB6612FNG电机PID控制基础资料

TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流 MOSFET-H 桥结构,双通道电路输出,可同时驱动 2个电机。 相比 L298N 的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只…

哨兵1号回波数据(L0级)包格式解析与成像参数提取

坑爹的格式,具体有多坑往下看就知道了。matlab代码在文末。 先上首字母缩写: 再来回波数据包的格式图 1. 数据包格式 众所周知,解包的第一步是找帧头和帧长,找到第4~5字节,帧长码为“0x3761”,转十进制为14777,然而实际第一帧整帧的长度是14184。。。你要是加6我还能…

力扣学习笔记——239. 滑动窗口最大值

力扣学习笔记——239. 滑动窗口最大值 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输…

大数据基础设施搭建 - Hive

文章目录 一、上传压缩包二、解压压缩包三、配置环境变量四、初始化元数据库4.1 配置MySQL地址4.2 拷贝MySQL驱动4.3 初始化元数据库4.3.1 创建数据库4.3.2 初始化元数据库 五、启动元数据服务metastore5.1 修改配置文件5.2 启动/关闭metastore服务 六、启动hiveserver2服务6.1…

【MySQL系列】PolarDB入门使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode OJ循环队列(C语言)

1.题目的初步分析 我们分析上述题目的时候会发现题目非常的长,不好整理思路,我这里可以大致的将本题的几个核心点说出来: 1.队列的思路 循环队列说来说去不还是队列嘛,那么队列的基本操作增删查改、以及队列的基本结构肯定都是不能…

JSP JSTL引入依赖并演示基础使用

然后 我们来讲 JSTL Java server pages standarded tag library 简称 JSTL 这是 一个 JSP的标准标签库 JSP标准标签的集合 封装了JSP中的通用核心功能 根据JSTL类库提供的标签 可以将他分为5个类 1 核心标签 2 格式化标签 3 SQL标签 4 XML标签 5 函数标签 这边 我们主要将 核…

超越噪音,让音乐重获新生:iZotope RX 10音频降噪修复软件

在音乐制作或者音频处理的过程中,噪音往往是一个让人头痛的问题。无论是环境噪音,还是设备产生的噪音,都会对音频质量产生重大影响。而现在,我们有了iZotope RX 10,这款专业的音频降噪修复软件,可以将你从噪…

全面预算管理,帮助企业财务团队冲破市场挑战

在实现企业财务发展的必经之路上,大多数财务专业人士会通过实施全面预算管理策略,为部门乃至整个组织建立一个用于数据管理和预测分析的财务模型,旨在影响和监控业务决策和变化趋势。全面预算管理通常包括历史数据分析和关于未来走向更详细的…

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny) 这次实验,我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测,然后后面又使用了Canny算法进行边缘检测。 直接看代码,代…
最新文章