文章目录
一、为什么要用 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
通过调用脚本自身的stop
和start
操作来重启程序。$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
五、补充:增强功能
- 加入日志清理
可以在脚本中加入日志清理功能,在程序启动或重启时,将旧的日志文件重命名并保存,以便后续查看:
[ -f "$LOG_FILE" ] && mv $LOG_FILE "$LOG_FILE.$(date +%Y%m%d%H%M%S)"
- 支持自定义参数
可以通过传入命令行参数来动态指定 JAR 文件名或 JVM 参数。例如:
APP_NAME=${2:-"myapp-1.0.jar"}
- 启动失败检测
启动程序后,可以检测程序是否成功启动。如果程序未启动成功,可以输出错误信息并退出:
if ! ps -p $(cat $PID_FILE) > /dev/null; then
echo "启动失败!"
rm -f $PID_FILE
exit 1
fi
博客主页: 总是学不会.