How to Run a Java JAR File as a Persistent Background Process on Linux


3 views

When deploying Java applications as JAR files on Linux servers, developers often need them to run continuously in the background. This becomes crucial for:

  • Server applications (like socket listeners)
  • Long-running batch processes
  • Microservices that must stay available

The simplest approach uses the ampersand operator:

java -jar yourApp.jar &

While this runs the process in the background, it has limitations:

  • Process terminates when the terminal session ends
  • No automatic restart on failures
  • Difficult to monitor

1. Using nohup

Prevents process termination when the terminal closes:

nohup java -jar yourApp.jar > output.log 2>&1 &

Key features:

  • Redirects output to a log file
  • Continues running after logout
  • Simple to implement

2. Creating a Systemd Service

For enterprise-grade management:


[Unit]
Description=My Java Service
After=syslog.target

[Service]
User=appuser
ExecStart=/usr/bin/java -jar /path/to/yourApp.jar
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

Implementation steps:

  1. Save as /etc/systemd/system/myapp.service
  2. Enable: sudo systemctl enable myapp
  3. Start: sudo systemctl start myapp

3. Advanced Process Management with screen

For interactive monitoring:


screen -S javasession
java -jar yourApp.jar
# Detach with Ctrl-A then D
# Reattach: screen -r javasession

Essential commands for managing background Java processes:


# List Java processes
ps aux | grep java

# Check resource usage
top -p $(pgrep -d',' java)

# View logs
journalctl -u myapp.service -f
  • Always implement proper logging (Log4j2/SLF4J)
  • Include health check endpoints in your application
  • Set appropriate JVM memory parameters
  • Consider using process managers like Supervisor for non-systemd systems

Problem: Process dies unexpectedly

  • Check OOM errors in logs
  • Verify file permissions
  • Test with simpler JAR first

Problem: Can't bind to port

  • Check for existing processes: sudo netstat -tulnp | grep :port
  • Verify firewall settings

When running a Java application that needs to operate continuously (like a socket listener), you'll want it to persist even after closing your terminal session. The simple java -jar test.jar command won't suffice because:

  • The process terminates when the terminal closes
  • Output floods your current session
  • No easy way to manage the lifecycle

The simplest approach for background execution:

nohup java -jar test.jar > output.log 2>&1 &

Breakdown:

  • nohup prevents termination on hangup signal
  • > output.log redirects stdout to a file
  • 2>&1 redirects stderr to stdout
  • & runs the process in background

For interactive monitoring:

# Install screen if needed
sudo apt-get install screen

# Create detached session
screen -S myjar -d -m java -jar test.jar

# Reattach later
screen -r myjar

For professional deployments:

# Create service file
sudo nano /etc/systemd/system/myapp.service

[Unit]
Description=My Java Application
After=syslog.target

[Service]
User=appuser
WorkingDirectory=/path/to/jar
ExecStart=/usr/bin/java -jar test.jar
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

Then enable and start:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

To verify your background process:

ps aux | grep java
# or for systemd services
systemctl status myapp
  • Always implement proper logging (Log4j/SLF4J recommended)
  • For socket applications, consider implementing health checks
  • Monitor memory usage - Java apps can leak over time
  • Use jstack for thread analysis if needed