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/null
    if [ $? -ne 0 ]; then
        # 如果程序不在运行,则重新启动
        echo "程序未运行,重新启动中..."
        nohup $JAVA_PROGRAM >> "$LOG_DIR/$LOG_PREFIX.log" 2>&1 &
    else
        echo "程序正在运行..."
    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

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

今日推荐

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-22 01:14:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-22 01:14:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-22 01:14:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-22 01:14:01       20 阅读

热门阅读

  1. AcWing 787. 归并排序(模板题详解)

    2024-01-22 01:14:01       33 阅读
  2. Restify快速上手

    2024-01-22 01:14:01       28 阅读
  3. 2024自学网络安全(黑客)

    2024-01-22 01:14:01       34 阅读
  4. LeetCode——二叉树

    2024-01-22 01:14:01       38 阅读
  5. 解决elementUI中使用checkbox无法选中的问题

    2024-01-22 01:14:01       38 阅读