1. 引言

有时我们需要让Java程序在后台持续运行,即使关闭终端也不中断。本文将探讨多种实现方案,重点介绍如何让Java进程作为独立会话运行,确保终端关闭后仍能继续工作。

2. 使用后台进程运行Java

最简单的方式是在shell脚本中使用&操作符:

#!/bin/sh
java -jar /web/server.jar &
echo $! > startupApp.pid

&让进程在后台运行,释放终端控制权
$! > startupApp.pid捕获并存储进程PID,便于后续管理

⚠️ 踩坑提醒:关闭终端时进程仍可能被终止,且缺乏服务管理能力(如日志查看、启停控制)

3. 使用nohup保持进程存活

若需确保关闭会话后进程继续运行,nohup是理想选择:

nohup java -jar /web/server.jar > output.log 2>&1 &
echo $! > startupApp.pid

nohup使进程忽略挂断信号
> output.log 2>&1重定向标准输出和错误到日志文件
&确保后台运行

终止进程命令:

kill $(cat startupApp.pid)

4. 使用systemd服务运行(Linux服务器)

对于长期运行的Java进程,推荐使用systemd管理服务:

sudo nano /etc/systemd/system/myjavaapp.service

服务配置示例:

[Unit]
Description: Java Background Service
After=network.target

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
WorkingDirectory=/web
Restart=always
User=root
StandardOutput=append:/var/log/myjavaapp.log
StandardError=append:/var/log/myjavaapp.err

[Install]
WantedBy=multi-user.target

关键配置解析:

  • [Unit]
    • After=network.target:网络就绪后启动(依赖网络服务时必备)
  • [Service]
    • ExecStart:Java程序启动命令
    • WorkingDirectory:工作目录
    • Restart=always:崩溃自动重启
    • User=root:运行用户(⚠️ 生产环境建议使用非root用户)
    • StandardOutput/Error:日志重定向路径
  • [Install]
    • WantedBy=multi-user.target:系统启动时自动加载

服务管理命令:

sudo systemctl daemon-reload      # 重载配置
sudo systemctl enable myjavaapp   # 开机自启
sudo systemctl start myjavaapp    # 启动服务
sudo systemctl status myjavaapp   # 查看状态
sudo systemctl stop myjavaapp     # 停止服务

5. 使用screen/tmux管理后台进程

systemd/nohup不同,screentmux支持会话分离与重连:

  • screen用法

    screen -S myjavaapp java -jar /web/server.jar  # 创建会话
    # 分离:Ctrl+A → D
    screen -r myjavaapp  # 重连会话
    
  • tmux用法

    tmux new-session -s myjavaapp 'java -jar /web/server.jar'  # 创建会话
    # 分离:Ctrl+B → D
    tmux attach-session -t myjavaapp  # 重连会话
    

核心优势:会话持久化,断网/关机后可恢复现场
对比

  • screen:轻量级,多数Linux预装
  • tmux:功能更强大,需单独安装

6. 总结

本文介绍了四种Java后台运行方案:

  1. 简单场景&nohup快速实现
  2. 生产环境systemd提供完整服务管理
  3. 开发调试screen/tmux支持会话恢复

选择建议:

  • ✅ 临时任务 → nohup
  • ✅ 服务器部署 → systemd
  • ✅ 需要交互 → tmux

根据实际需求选择合适方案,避免踩坑的同时提升运维效率。


原始标题:How to Run a Java Program in the Background | Baeldung