Shell 脚本实现自动启动程序、日志管理和定时任务监控

简介

本篇将通过Shell 脚本实现自动启动Java程序、日志管理和定时任务监控。脚本启动程序具灵活定制、可移植性和扩展性强的优点,可以根据需要添加额外的功能、配置选项和自定义行为,从而满足更具体的要求。

脚本编写

vim start_program.sh
#!/bin/bash
cd /path/to/youdir
# 设置Java程序的名称
JAVA_PROGRAM="java -jar test.jar"
# 设置日志输出路径
LOG_DIR="/path/to/log"
# 设置日志文件的前缀
LOG_PREFIX="program_log"
# 设置日志文件的最大大小(200M)
MAX_LOG_SIZE=200000000
# 设置最多保留的日志文件个数
MAX_LOG_FILES=7
# 设置定时任务检查的端口
CHECK_PORT=your_program_port# 创建日志目录
mkdir -p "$LOG_DIR"
# 在日志轮转之前创建一个空白的日志文件
touch "$LOG_DIR/$LOG_PREFIX.log"# 定义日志轮转函数
rotate_logs() {# 检查日志文件数量是否超过最大保留个数if [ $(ls -1 "$LOG_DIR/$LOG_PREFIX"* | wc -l) -gt $MAX_LOG_FILES ]; then# 删除最旧的日志文件rm -f "$(ls -1t "$LOG_DIR/$LOG_PREFIX"* | tail -n 1)"fi# 检查当前日志文件大小是否超过最大大小if [ $(wc -c <"$LOG_DIR/$LOG_PREFIX.log") -gt $MAX_LOG_SIZE ]; then# 轮转日志文件mv "$LOG_DIR/$LOG_PREFIX.log" "$LOG_DIR/$LOG_PREFIX-$(date +'%Y%m%d%H%M%S').log"touch "$LOG_DIR/$LOG_PREFIX.log"fi
}# 定义检查程序运行状态函数
check_program_status() {# 检查程序是否在运行netstat -an | grep "$CHECK_PORT" > /dev/nullif [ $? -ne 0 ]; then# 如果程序不在运行,则重新启动echo "程序未运行,重新启动中..."nohup $JAVA_PROGRAM >> "$LOG_DIR/$LOG_PREFIX.log" 2>&1 &elseecho "程序正在运行..."fi
}# 调用日志轮转函数
rotate_logs# 调用检查程序运行状态函数
check_program_status

确保将脚本中的/path/to/log和your_program_port等替换为实际的日志路径和程序监听的端口。然后,赋予脚本执行权限:

chmod +x start_program.sh

最后,将脚本添加到定时任务中。您可以使用crontab -e命令编辑定时任务表,例如:

*/5 * * * * /path/to/start_program.sh

程序运行示例
在这里插入图片描述
Java程序最好是运行在一个低权限的用户中,以保证系统不会因为Java程序出错而受到影响。

脚本释义

Shebang 行:

#!/bin/bash

这一行指定了用于运行脚本的解释器,这里是 Bash。
Java 程序和日志设置:

JAVA_PROGRAM="java -jar test.jar"
LOG_DIR="/path/to/log"
LOG_PREFIX="program_log"
MAX_LOG_SIZE=200000000
MAX_LOG_FILES=7
CHECK_PORT=your_program_port

这些行定义了 Java 程序的命令、日志目录、日志文件前缀、最大日志大小、最大保留的日志文件数以及用于检查程序运行状态的端口。
创建日志目录:

mkdir -p "$LOG_DIR"

这一行创建日志目录,-p选项确保如果目录不存在,也会创建。
启动 Java 程序:

nohup $JAVA_PROGRAM >> "$LOG_DIR/$LOG_PREFIX.log" 2>&1 &

这一行使用 nohup 启动 Java 程序,并将输出追加到指定路径的日志文件中。2>&1将标准错误流(stderr)也重定向到标准输出流(stdout),&使得该命令在后台运行。
定义日志轮转函数:

rotate_logs() {# ...
}

这一部分定义了一个函数 rotate_logs,用于实现日志轮转的逻辑。
检查程序运行状态函数:

check_program_status() {# ...
}

这一部分定义了一个函数 check_program_status,用于检查程序运行状态的逻辑。
调用日志轮转函数:

rotate_logs

这一行调用了之前定义的 rotate_logs 函数,执行日志轮转逻辑。
调用检查程序运行状态函数:

调用检查程序运行状态函数:

这一行调用了之前定义的 check_program_status 函数,执行检查程序运行状态的逻辑。
最后,确保将脚本中的/path/to/log和your_program_port等替换为实际的日志路径和程序监听的端口。赋予脚本执行权限,并将脚本添加到定时任务中。
######################################################################################################################

今日推荐

小说:《仙狐》
推荐理由:创意A,开篇A,文笔也不错,太平天兵这个概念还是蛮不错的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习入门——卷积神经网络CNN基本原理+实战

CNN基本结构 ​ 卷积神经网络&#xff08;Convolutional Neural Network,CNN&#xff09;是深度学习技术中最基础的网络结构&#xff0c;模拟人脑工作&#xff0c;具备强大的特征学习能力。CNN结构主要由两部分组成&#xff1a;特征提取部分和分类部分\color{blue}{特征提取部…

RS-485通讯

RS-485通讯协议简介 与CAN类似&#xff0c;RS-485是一种工业控制环境中常用的通讯协议&#xff0c;它具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改进而来&#xff0c;协议层不变&#xff0c;只是改进了物理层&#xff0c;因而保留了串口通讯协议应用简单…

挑战杯参赛总结-时间序列预测

参赛任务&#xff1a; 目标&#xff1a;针对中国各个市区的不同年份二氧化碳排放量&#xff0c;预测未来年份的二氧化碳排放量。 不同与之前我学习过的波士顿房价预测机器学习-波士顿房价预测-CSDN博客 房价预测是通过学习与房价有关的很多特征&#xff0c;训练出一个模型来预…

【测试入门】测试用例经典设计方法 —— 因果图法

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

AttributeError: module ‘openai‘ has no attribute ‘error‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Zuul1.x 高并发下阻塞分析以及解决方案

背景 由于最近博主在压测接口的时候发现我接口出现卡死状态&#xff0c;最开始以为是我自己接口出现问题&#xff0c;单独压测我自己的服务&#xff08;不经过网关&#xff09;200/qps/10 次循环 是没问题&#xff0c;但是加上网关&#xff08;zuul 1.x&#xff09; 去发现 经…

React入门 - 08(组件拆分组件传值)

本章内容 目录 父组件向子组件传递数据子组件向父组件传递数据 上一节内容我们补充l了在 React使用 JSX语法的一些细节。本节我们继续使用 ”TodoList“ 案例来讲解一下”组件拆分与组件传值“ 父组件向子组件传递数据 打开一开始我们已经创建好的工程&#xff0c;现在我们用…

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即

成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员&#xff0c;完成该课程后&#xff0c;学员将达到DevOps的专家级水平&#x…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

Bit.Store 加密卡集成主流 BRC20通证,助力 BTC 生态流动性

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中&#xff0c;通过以其推出的加密银行卡为媒介&#xff0c;助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初&#xff0c;就是以一种去中心化、点对点的现金系统为定…

数据结构之二叉树的性质与存储结构

数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;…

python写完程序怎么运行

python有两种运行方式&#xff0c;一种是在python交互式命令行下运行; 另一种是使用文本编辑器直接在命令行上运行。 注&#xff1a;以上两种运行方式均由CPython解释器编译运行。 当然&#xff0c;也可以将python代码写入eclipse中&#xff0c;用JPython解释器运行&#xff0c…