想要保证后台运行java -jar,可以使用 Bash 脚本来启动一个 Java 应用程序作为后台守护进程
首先创建一个shell脚本,可以自己定义放在虚拟机的某个文档中,我放在了opt目录下,这个目录可以自己定义,起名为 app.sh
里面的内容如下:26行
nohup java -jar demo-0.0.1-SNAPSHOT.jar >> "$LOG_FILE" 2>&1 &
部分注意更改自己的jar包名
# 定义工作目录WORK_DIR="/opt"# 定义日志文件路径LOG_FILE="$WORK_DIR/myapp.log"# 定义 PID 文件路径,这个是起了个进程号PID_FILE="$WORK_DIR/myapp.pid"# 创建工作目录和日志文件夹(如果不存在)mkdir -p "$WORK_DIR"# 检查应用程序是否已经在运行is_running() { local pid_file=$1 if [ -f "$pid_file" ]; then local pid=$(cat "$pid_file") if ps -p $pid > /dev/null 2>&1; then return 0 # 进程存在 fi fi return 1 # 进程不存在}# 启动 Java 应用start_app() { if is_running "$PID_FILE"; then echo "应用程序已在运行" else cd "$WORK_DIR" nohup java -jar demo-0.0.1-SNAPSHOT.jar >> "$LOG_FILE" 2>&1 & local new_pid=$! echo $new_pid > "$PID_FILE" echo "应用程序开始运行 PID: $new_pid" fi}# 停止 Java 应用stop_app() { if is_running "$PID_FILE"; then local pid=$(cat "$PID_FILE") kill $pid while ps -p $pid > /dev/null; do sleep 1; done rm "$PID_FILE" echo "应用程序已停止" else echo "应用程序未运行" fi}case "$1" in start) start_app ;; stop) stop_app ;; restart) stop_app start_app ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;;esacexit 0
Bash
然后先给他一个权限,使用命令:
chmod +x app.sh
Bash
然后运行他,使用命令:
./app.sh start //运行命令./app.sh stop //停止命令./app.sh restart //重启命令
Plain Text
如果运行后出现以下错误,是说明app.sh里面有一些空格
./app.sh:行10: 未预期的符号“$'{\r'”附近有语法错误'/app.sh:行10: `is_running() {
Bash
可以使用命令解决:
sed 's/\r$//' < app.sh > app_fixed.sh //读取app.sh文件,去除每行末尾的 \r 字符,并将结果保存到 app_fixed.sh 文件中,保存为另一个文件是为了防止里面数据误删mv app_fixed.sh app.sh //这个命令就是把上面的命令保存的文件再重命名为app.sh
Bash
然后重新启动就行了,可以在日志文件中查看运行日志
如果运行日志中报下面错误
nohup: 无法运行命令 'java': No such file or directory
Bash
这是因为虚拟机中没有安装JDK
先用命令检查一下是否安装
java -version
Bash
如果没有的话,可以下载一个JDK,使用命令
dnf search openjdk //查找可用的JDK版本,根据自己的项目下载sudo dnf install java-1.8.0-openjdk //安装JDK,根据自己所需要的JDK,更改1.8.0部分
Bash
然后就直接重新运行就好了,下面是运行日志
我用的是之前的仓储管理系统,前端的URL改成虚拟机的地址就行了,然后运行,这个日志文件不是实时更新的,需要重新打开才能看到最新的日志