Shell 脚本管理 Java 程序的实现示例

 更新时间:2025年10月27日 09:59:45   作者:总是学不会.  
Shell脚本是一种自动化工具,能够帮助我们批量执行任务,对于运行 Java 程序的场景,使用脚本可以避免每次手动输入复杂命令,提高效率并减少出错概率,感兴趣的可以了解一下

一、为什么要用 Shell 脚本?

在开发和部署 Java 程序时,通常需要进行一些重复性操作,如启动、停止、查看状态以及重启程序。手动执行这些操作往往麻烦且容易出错,而通过 Shell 脚本,可以将这些操作封装为简单的命令行调用。

例如,假设每次部署后需要启动应用,并查看是否正常运行。Shell 脚本可以帮助我们实现:

  • 自动启动程序并将输出重定向到日志文件中。
  • 检查程序是否已经在运行,避免重复启动。
  • 停止正在运行的程序,确保优雅关闭。
  • 定期重启程序,保持应用的健康状态。

使用 Shell 脚本可以提高操作的自动化和可靠性,尤其是在自动化部署、CI/CD 管道中,能够大大简化运维工作。

二、Shell 脚本的基础知识

1. 基本结构

Shell 脚本是一个包含一系列命令的文本文件,文件的第一行通常指定解释器。最常见的解释器是 bash,通过 #!/bin/bash 来指定,表示后续的命令使用 bash 解释器来执行。

#!/bin/bash

2. 常用命令

  • echo:将文本输出到终端。
  • ps:列出系统中运行的进程。
  • kill:结束指定的进程。
  • nohup:忽略挂起信号(让程序在后台运行,保持程序在会话关闭后仍然继续运行)。
  • case ... in ... esac:条件语句,用于根据传入的参数选择不同的操作。

三、Shell 脚本示例分析

完整脚本

#!/bin/bash

# 配置部分
APP_NAME="myapp-1.0.jar"  # 程序的 JAR 包名称
LOG_FILE="app.log"        # 日志文件
PID_FILE="app.pid"        # PID 文件,用于存储程序的进程 ID

# 脚本的主逻辑
case "$1" in
    start)
        # 检查是否已经运行
        if [ -f "$PID_FILE" ]; then
            echo "程序已运行,PID=$(cat $PID_FILE)"
            exit 1
        fi

        # 后台启动程序
        echo "正在启动程序..."
        nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &
        echo $! > $PID_FILE
        echo "程序已启动,PID=$(cat $PID_FILE)"
        ;;

    stop)
        # 检查是否有运行中的程序
        if [ -f "$PID_FILE" ]; then
            echo "正在停止程序,PID=$(cat $PID_FILE)..."
            kill $(cat $PID_FILE)
            rm -f $PID_FILE
            echo "程序已停止"
        else
            echo "未找到运行中的程序"
        fi
        ;;

    restart)
        # 重启程序
        $0 stop
        $0 start
        ;;

    status)
        # 检查程序状态
        if [ -f "$PID_FILE" ]; then
            echo "程序正在运行,PID=$(cat $PID_FILE)"
        else
            echo "程序未运行"
        fi
        ;;

    *)
        # 提示用法
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

脚本详解

1. 变量配置

APP_NAME="myapp-1.0.jar"
LOG_FILE="app.log"
PID_FILE="app.pid"
  • APP_NAME:指定要运行的 Java 程序的 JAR 文件名。
  • LOG_FILE:日志文件,用于输出程序的标准输出和错误输出。
  • PID_FILE:保存程序的进程 ID,用于停止或查看程序的状态。

2.start部分

if [ -f "$PID_FILE" ]; then
    echo "程序已运行,PID=$(cat $PID_FILE)"
    exit 1
fi

nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "程序已启动,PID=$(cat $PID_FILE)"
  • 检查是否正在运行:通过检查 $PID_FILE 是否存在来判断程序是否已经启动。如果文件存在,说明程序已在运行,避免重复启动。
  • 启动程序:使用 nohup 命令在后台运行 Java 程序,并将程序的标准输出和错误输出重定向到 $LOG_FILE$! 获取最近启动的进程的 PID,并将其存入 $PID_FILE 中。

3.stop部分

if [ -f "$PID_FILE" ]; then
    kill $(cat $PID_FILE)
    rm -f $PID_FILE
    echo "程序已停止"
else
    echo "未找到运行中的程序"
fi
  • 检查程序是否运行:通过 $PID_FILE 判断程序是否在运行。如果运行,则发送 kill 信号停止程序,并删除 PID 文件。

4.status部分

if [ -f "$PID_FILE" ]; then
    echo "程序正在运行,PID=$(cat $PID_FILE)"
else
    echo "程序未运行"
fi
  • 通过检查 $PID_FILE 是否存在来判断程序是否正在运行,并显示当前进程的 PID。

5.restart部分

$0 stop
$0 start
  • restart 通过调用脚本自身的 stopstart 操作来重启程序。$0 表示脚本本身。

6. 默认提示

echo "用法: $0 {start|stop|restart|status}"
  • 如果脚本传入了不正确的参数,输出如何使用脚本的提示信息。

四、脚本的使用方法

1. 创建脚本

将脚本内容保存为 app.sh 文件。

2. 赋予执行权限

chmod +x app.sh

3. 运行脚本

  • 启动程序:

    ./app.sh start
    
  • 停止程序:

    ./app.sh stop
    
  • 查看程序状态:

    ./app.sh status
    
  • 重启程序:

    ./app.sh restart
    

五、补充:增强功能

  1. 加入日志清理

可以在脚本中加入日志清理功能,在程序启动或重启时,将旧的日志文件重命名并保存,以便后续查看:

[ -f "$LOG_FILE" ] && mv $LOG_FILE "$LOG_FILE.$(date +%Y%m%d%H%M%S)"
  1. 支持自定义参数

可以通过传入命令行参数来动态指定 JAR 文件名或 JVM 参数。例如:

APP_NAME=${2:-"myapp-1.0.jar"}
  1. 启动失败检测

启动程序后,可以检测程序是否成功启动。如果程序未启动成功,可以输出错误信息并退出:

if ! ps -p $(cat $PID_FILE) > /dev/null; then
    echo "启动失败!"
    rm -f $PID_FILE
    exit 1
fi

到此这篇关于Shell 脚本管理 Java 程序的实现示例的文章就介绍到这了,更多相关Shell 脚本管理Java 程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • shell产生随机数七种方法的实现

    shell产生随机数七种方法的实现

    这篇文章主要介绍了shell产生随机数七种方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 列出所有Bash Shell内置命令的方法示例

    列出所有Bash Shell内置命令的方法示例

    大家都知道不同的Shell内置命令有所不同,所以下面这篇文章主要给大家介绍了关于如何列出所有Bash Shell内置命令的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-02-02
  • Linux 实现压缩保留源文件的方法

    Linux 实现压缩保留源文件的方法

    下面小编就为大家分享一篇Linux 实现压缩保留源文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • jenkins+shell自动化部署的实现步骤

    jenkins+shell自动化部署的实现步骤

    本文主要介绍了jenkins+shell自动化部署的实现步骤,通过jenkins与shell脚本相结合,实现war包自动部署到多台服务器上,感兴趣的可以了解一下
    2022-04-04
  • Shell编程之/bin/bash和/bin/sh的区别浅析

    Shell编程之/bin/bash和/bin/sh的区别浅析

    在redhat的系统中,sh是一个到bash的软链接,但是如果运行如下程序会产生不一样的结果,下面这篇文章主要给大家介绍了关于Shell编程之/bin/bash和/bin/sh的区别的相关资料,需要的朋友可以参考下
    2022-07-07
  • Centos下查看网卡的实时流量命令

    Centos下查看网卡的实时流量命令

    本文介绍了linux下查看网卡流量的六种方法,linux系统中使用nload、iftop、iostat等工具查看网卡流量,这里我们先来详细讲解下 iptraf 方法,需要的朋友参考下。
    2015-05-05
  • shell脚本中一些特殊符号

    shell脚本中一些特殊符号

    这篇文章主要介绍了shell脚本中一些特殊符号,需要的朋友可以参考下
    2015-07-07
  • shell脚本实现linux系统文件完整性检测

    shell脚本实现linux系统文件完整性检测

    这篇文章主要介绍了shell脚本实现linux系统文件完整性检测,本文给出的脚本使用对比MD5的方法,检测linux系统文件是否被替换等问题,需要的朋友可以参考下
    2014-12-12
  • nginx日志切割脚本分享

    nginx日志切割脚本分享

    nginx日志太大怎么办,只有分割一下了,这篇文章就介绍了一下nginx日志切割脚本,需要的朋友可以参考下
    2014-03-03
  • 通过Spring Shell 开发 Java 命令行应用

    通过Spring Shell 开发 Java 命令行应用

    这篇文章主要介绍了通过Spring Shell 开发 Java 命令行应用的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11

最新评论