Both nohup
and &
serve to run processes in the background, but they solve different problems in Linux/Unix environments.
# Using ampersand alone
python long_running_script.py &
# Using nohup
nohup python critical_process.py &
The ampersand (&
) simply detaches the process from your current terminal session:
- For short-lived background tasks you want to monitor
- When you don't need output preservation
- For processes that can safely terminate with your session
# Good for temporary background tasks
rsync -avz /source user@remote:/destination &
nohup
(no hangup) makes processes immune to SIGHUP signals and is essential for:
# Long-running processes that must survive logout
nohup ./start_server.sh > server.log 2>&1 &
# Critical batch jobs
nohup python data_pipeline.py > pipeline.log 2>&1 &
Feature | & | nohup |
---|---|---|
SIGHUP protection | No | Yes |
Output handling | Terminal | nohup.out by default |
Session persistence | Terminates on logout | Continues after logout |
For enterprise applications, combine both with proper output redirection:
nohup java -jar app.jar > /var/log/app.log 2>&1 &
# Verify running process
ps aux | grep app.jar
- Forgetting output redirection with nohup (fills up disk)
- Using & for long-running processes that need to survive reboots
- Not monitoring nohup processes (consider using screen/tmux for critical jobs)
For production systems, consider:
# Systemd service units
sudo systemctl enable myapp.service
# Using tmux/screen
tmux new -s mysession
./long_running_process
# Detach with Ctrl+B D
When working with Linux command-line operations, two common techniques for process management are the nohup
command and the &
operator. While both allow processes to run in the background, they serve different purposes in different scenarios.
Using &
at the end of a command makes it run in the background immediately:
python3 long_running_script.py &
Key characteristics:
- Returns control to the shell immediately
- Process becomes a child of the current shell
- Process will terminate if the parent shell exits
- Output still goes to the terminal by default
nohup
makes commands immune to hangup signals and detaches them from the terminal:
nohup python3 critical_process.py > output.log 2>&1 &
Essential features:
- Ignores SIGHUP signals (sent when terminal closes)
- Redirects output to nohup.out by default
- Process survives terminal/session termination
- Often combined with
&
for background execution
Feature | & | nohup |
---|---|---|
Background execution | Yes | No (unless combined with &) |
Survives terminal exit | No | Yes |
Output handling | Terminal | nohup.out or specified file |
Signal handling | Normal | Ignores SIGHUP |
When to use &:
# Quick background task while maintaining session tar -czf backup.tar.gz /important_data &
When to use nohup:
# Long-running server process that must survive logout nohup java -jar production_server.jar > server.log 2>&1 &
For maximum control:
# Redirect output, ignore hangups, and run in background nohup ./data_processor.sh > processing.log 2>&1 & # Check running background jobs jobs -l # Disown a process to fully detach it from shell python3 background_task.py & disown %1
# Check if process survived terminal exit ps aux | grep python # Verify nohup output location ls -lh nohup.out # Alternative modern approach using screen/tmux tmux new -s mysession python3 persistent_script.py # Detach with Ctrl+B then D