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


18 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