【1】启动命令
bash
nohup java -jar your-application.jar > /dev/null 2>&1 &
> /dev/null 2>&1:
这条命令将标准输出和标准错误都重定向到/dev/null,这意味着它们不会输出到控制台或任何文件。这样做是因为我们希望所有日志都由Logback处理并写入到配置文件中指定的日志文件里。
然而,如果你想要保留控制台输出(例如,对于调试目的),你可以省略这部分重定向,让Logback同时处理日志输出:
bash
nohup java -jar your-application.jar &
【2】三个脚本
为了创建启动、重启和停止脚本,我们可以编写简单的Shell脚本来管理你的Java应用程序(study-0.0.1-SNAPSHOT.jar
),并确保它在指定端口(8080)上运行。以下是每个脚本的示例代码。
启动脚本 start.sh
bash
#!/bin/bash
# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"
# 检查应用是否已经在运行
if pgrep -f "$APP_NAME" > /dev/null; then
echo "$APP_NAME is already running."
else
# 使用nohup启动应用,并将日志输出到nohup.out
nohup java -jar $APP_NAME --server.port=8080 > /dev/null 2>&1 &
echo "$APP_NAME started."
fi
停止脚本 stop.sh
bash
#!/bin/bash
# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"
# 查找并终止应用进程
PIDS=$(pgrep -f "$APP_NAME")
if [ -z "$PIDS" ]; then
echo "$APP_NAME is not running."
else
kill $PIDS
echo "Stopped $APP_NAME (PID(s): $PIDS)."
fi
重启脚本 restart.sh
bash
#!/bin/bash
# 调用停止脚本
./stop.sh
# 等待几秒钟以确保应用完全停止
sleep 5
# 调用启动脚本
./start.sh
注意事项
-
权限:确保脚本具有可执行权限。你可以通过以下命令为所有脚本添加执行权限:
bashchmod +x start.sh stop.sh restart.sh
-
路径:确保脚本与你的JAR文件位于同一目录下,或者在脚本中使用绝对路径来引用JAR文件。
-
日志重定向 :在
start.sh
脚本中,我们使用了nohup
命令并将标准输出和错误重定向到nohup.out
。如果需要自定义日志文件名或位置,可以修改这部分配置。 -
检查应用状态 :
pgrep -f "$APP_NAME"
用于查找正在运行的应用实例。这种方式依赖于应用名称的唯一性,如果存在多个同名应用,可能需要更精确的方法来识别目标进程。
运行脚本
-
启动应用:
bash./start.sh
-
停止应用:
bash./stop.sh
-
重启应用:
bash./restart.sh
【3】优化后的 restart.sh
为了优化重启脚本,使其不依赖于start.sh
和stop.sh
,我们可以直接在restart.sh
中实现停止和启动逻辑。这样做不仅可以减少对外部脚本的依赖,还能使整个流程更加简洁高效。
bash
#!/bin/bash
# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"
PORT=8080
# 函数:检查应用是否正在运行
is_running() {
pgrep -f "$APP_NAME" > /dev/null 2>&1
}
# 停止应用
stop_app() {
if is_running; then
echo "Stopping $APP_NAME..."
PIDS=$(pgrep -f "$APP_NAME")
kill $PIDS
# 等待几秒钟确保进程已完全停止
for i in {1..10}; do
if ! is_running; then
echo "$APP_NAME stopped."
return 0
fi
sleep 1
done
echo "Failed to stop $APP_NAME gracefully, forcing termination."
kill -9 $PIDS
else
echo "$APP_NAME is not running."
fi
}
# 启动应用
start_app() {
if is_running; then
echo "$APP_NAME is already running."
else
echo "Starting $APP_NAME..."
nohup java -jar $APP_NAME --server.port=$PORT > /dev/null 2>&1 &
# 确认应用是否成功启动
for i in {1..10}; do
if is_running; then
echo "$APP_NAME started successfully."
return 0
fi
sleep 1
done
echo "Failed to start $APP_NAME."
exit 1
fi
}
# 主逻辑
echo "Restarting $APP_NAME..."
stop_app
start_app
脚本解释
-
is_running
函数 :用于检查应用程序是否正在运行。它使用pgrep
命令查找与应用名称匹配的进程。 -
stop_app
函数:- 首先检查应用是否正在运行。
- 如果是,则发送终止信号给进程,并等待几秒钟以确保应用已经完全停止。
- 如果应用没有在规定时间内停止,则强制终止(通过发送
kill -9
信号)。
-
start_app
函数:- 检查应用是否已经在运行。
- 如果没有运行,则使用
nohup
命令启动应用,并将输出重定向到nohup.out
。 - 等待几秒钟以确认应用是否成功启动。
-
主逻辑部分 :调用
stop_app
函数停止应用,然后调用start_app
函数启动应用。
使用方法
-
直接运行
restart.sh
脚本来重启你的Java应用:bash./restart.sh
注意事项
-
权限:确保脚本具有可执行权限。可以通过以下命令添加执行权限:
bashchmod +x restart.sh
-
路径:确保脚本与JAR文件位于同一目录下,或者在脚本中使用绝对路径引用JAR文件。
-
日志管理 :当前的日志被重定向到了
nohup.out
。如果需要更复杂的日志管理策略(如按日期分割日志),可以考虑使用Logrotate或其他工具。
通过这种方式,你可以简化脚本的管理和维护,同时确保重启过程可靠且易于控制。