自动化部署脚本:一键启动、停止、重启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脚本进行自动化部署的初学者有所帮助。如有问题或建议,欢迎留言交流。