分享一个自己用的Linux中自动化部署脚本:一键启动、停止、重启Java应用

自动化部署脚本:一键启动、停止、重启Java应用

在实际应用部署过程中,我们经常需要一套简便的脚本来管理应用的启动、停止和重启等操作。本文介绍了一个基于Shell脚本编写的自动化部署脚本,用于管理Java应用的生命周期。

1. 背景

假设我们有一个Java应用,其执行文件为 testfile.jar,我们希望通过脚本来方便地启动、停止和重启这个应用。同时,我们还希望能够查看当前应用的运行状态。

2. 脚本编写

以下是一个完整的Shell脚本,通过该脚本可以实现启动、停止、查看状态和重启Java应用的功能。在脚本中,我们使用了 ps 命令来获取进程ID,kill 命令来终止进程,以及 nohup 命令来将应用在后台运行。

#!/bin/bash
# 定义变量
# 要运行的jar包路径
JAR_NAME="/home/webapps/testfile/testfile-back/testfile.jar"
# 日志路径
LOG_PATH="/home/webapps/testfile/testfile-back/console.out"

# 如果输入格式不对,给出提示!
tips() {
    echo ""
    echo "警告!!!......请使用命令:sh auto_deploy.sh [start|stop|restart|status]。例如:sh auto_deploy.sh start"
    echo ""
    exit 1
}

# 启动方法
start() {
    # 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
    pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
    # -z 表示如果$pid为空时执行
    if [ -z "$pid" ]; then
        nohup java -jar "$JAR_NAME" -Xms512m -Xmx512m > "$LOG_PATH" 2>&1 &
        pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
        echo ""
        echo "服务 ${JAR_NAME} 正在启动!pid=${pid}"
        echo "........................以下是日志输出.............................."
        echo "....................................................................."
        # tail -f "$LOG_PATH"
        echo "........................启动成功!........................."
    else
        echo ""
        echo "服务 ${JAR_NAME} 已经在运行中,其pid为 ${pid}。如有需要,请使用命令:sh auto_deploy.sh restart。"
        echo ""
    fi
}

# 停止方法
stop() {
    # 重新获取一下pid,因为其它操作如start会导致pid的状态更新
    pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
    # -z 表示如果$pid为空时执行
    if [ -z "$pid" ]; then
        echo ""
        echo "服务 ${JAR_NAME} 未在运行中,无需停止!"
        echo ""
    else
        kill -9 "$pid"
        echo ""
        echo "服务停止成功!pid:${pid} 已被强制结束!"
        echo ""
    fi
}

# 输出运行状态方法
status() {
    # 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
    pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
    # -z 表示如果$pid为空时执行
    if [ -z "$pid" ]; then
        echo ""
        echo "服务 ${JAR_NAME} 未在运行中!"
        echo ""
    else
        echo ""
        echo "服务 ${JAR_NAME} 正在运行,其pid为 ${pid}"
        echo ""
    fi
}

# 重启方法
restart() {
    echo ""
    echo ".............................正在重启.............................."
    echo "....................................................................."
    # 重新获取一下pid,因为其它操作如start会导致pid的状态更新
    pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
    # -z 表示如果$pid为空时执行
    if [ ! -z "$pid" ]; then
        kill -9 "$pid"
    fi
    start
    echo "....................重启成功!..........................."
}

# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
    "start")
        start
        ;;
    "stop")
        stop
        ;;
    "status")
        status
        ;;
    "restart")
        restart
        ;;
    *)
    tips
    ;;
esac

3. 脚本说明

3.1 变量定义

在脚本中,我们定义了两个变量,JAR_NAME 表示要运行的Java应用的路径,LOG_PATH 表示应用的日志路径。

JAR_NAME="/home/webapps/testfile/testfile-back/testfile.jar"
LOG_PATH="/home/webapps/testfile/testfile-back/console.out"

3.2 方法定义

脚本中定义了四个方法,分别是启动(start)、停止(stop)、查看状态(status)和重启(restart)。这些方法通过操作 ps 命令和 kill 命令来实现相应的功能。

# 启动方法
start() {
	# 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
	pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
	# -z 表示如果$pid为空时执行
	if [ -z "$pid" ]; then
		nohup java -jar "$JAR_NAME" -Xms512m -Xmx512m > "$LOG_PATH" 2>&1 &
		pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
		echo ""
		echo "Service ${JAR_NAME} is starting! pid=${pid}"
		echo "........................Here is the log.............................."
		echo "....................................................................."
		# tail -f "$LOG_PATH"
		echo "........................Start successfully!........................."
	else
		echo ""
		echo "Service ${JAR_NAME} is already running, its pid = ${pid}. If necessary, please use command: sh auto_deploy.sh restart."
		echo ""
	fi
}

# 停止方法
stop() {
	# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
	# -z 表示如果$pid为空时执行
	if [ -z "$pid" ]; then
		echo ""
		echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
		echo ""
	else
		kill -9 "$pid"
		echo ""
		echo "Service stopped successfully! pid:${pid} has been killed forcibly!"
		echo ""
	fi
}

# 输出运行状态方法
status() {
	# 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
	pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
	# -z 表示如果$pid为空时执行
	if [ -z "$pid" ]; then
		echo ""
		echo "Service ${JAR_NAME} is not running!"
		echo ""
	else
		echo ""
		echo "Service ${JAR_NAME} is running. Its pid=${pid}"
		echo ""
	fi
}

# 重启方法
restart() {
	echo ""
	echo ".............................Restarting.............................."
	echo "....................................................................."
	# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
	# -z 表示如果$pid为空时执行
	if [ ! -z "$pid" ]; then
		kill -9 "$pid"
	fi
	start
	echo "....................Restart successfully!..........................."
}

3.3 脚本参数处理

脚本通过 case 语句来处理用户输入的参数,根据参数调用相应的方法。如果用户没有输入参数或输入了无效的参数,脚本会显示提示信息。

# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
    "start")
        start
        ;;
    "stop")
        stop
        ;;
    "status")
        status
        ;;
    "restart")
        restart
        ;;
    *)
    tips
    ;;
esac

4. 使用方法

启动应用:sh auto_deploy.sh start
停止应用:sh auto_deploy.sh stop
查看应用状态:sh auto_deploy.sh status
重启应用:sh auto_deploy.sh restart

5. 总结

通过这个简单的Shell脚本,我们可以方便地管理Java应用的生命周期,提高部署和运维的效率。读者可以根据实际情况进行定制和扩展,使脚本更符合特定应用的需求。

希望本文对使用Shell脚本进行自动化部署的初学者有所帮助。如有问题或建议,欢迎留言交流。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岛森年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值