# Restarting Frappe Services Without Breaking Things
You need to restart your Frappe services. Sounds simple, right? Just run `fmx restart` and you're done!
Restarting isn’t always straightforward—production systems require extra care to avoid data loss or user disruption.
Not quite. If you're running a production system, there’s more to consider. Background workers may be processing important tasks, and if you stop them mid-job, you risk data corruption or unhappy users.
This guide will help you understand your options so you can restart services safely.
## What Actually Happens During a Restart?
When Frappe restarts, several components are recycled:
- **Web server** (Gunicorn/Nginx): Stops serving requests, then restarts
- **Background workers**: Are terminated and replaced with new ones
- **Scheduler**: The cron job trigger also restarts
During this process, your site is temporarily unavailable. The key question: how do you manage background jobs that might be running?
## Background Workers: The Hidden Heroes
Background workers handle behind-the-scenes tasks such as:
- Sending emails
- Generating reports
- Processing bulk operations
- Running scheduled tasks
If you terminate a worker halfway through updating 10,000 records, you can imagine the consequences.
## Check What's Running First
Before restarting, check the current activity:
**Quick check with bench:**
```bash
# default site
bench doctor
# Or for a specific site:
bench --site your.site.name doctor
```
**Check the web interface:**
Go to `/app/rq-jobs` in your Frappe site to view active jobs and queues.
## Your Restart Options
### 1. `fmx restart` (The Default)
**What it does:** Sends a "please stop" signal to all processes. Workers get a grace period to finish, then are forcibly killed if they don’t.
**When to use:**
- Development environments
- Emergencies when you need services back ASAP
- When no critical jobs are running
**Pros:** Fast
**Cons:** Jobs may be interrupted
### 2. `fmx restart --wait-workers` (The Safe Option)
**What it does:**
- Tells Redis to stop accepting new jobs
- Waits for all current jobs to finish
- Restarts services only after jobs are done
- Resumes normal operation afterward
**When to use:**
- Production environments
- When critical jobs are running
- Before database migrations
- Anytime data integrity matters
**Pros:** Maximum safety, no job interruption
**Cons:** Can take longer if jobs are lengthy
### 3. `fmx restart --no-wait-workers` (The Middle Ground)
**What it does:**
- Tells Redis to stop accepting new jobs
- Signals workers to finish current jobs gracefully
- Restarts services immediately
- Old workers may still finish in the background
**When to use:**
- You want RQ coordination but can’t wait
- Routine updates where service availability is a priority
- Jobs are typically short-running
**Pros:** Faster, provides some coordination
**Cons:** No guarantee jobs finish before workers are replaced
## Database Migrations
If you’re running `fmx restart --migrate`, you’re changing the database structure. This is critical:
Always use `--wait-workers` with migrations to ensure jobs finish before the database changes.
- **Good:** `fmx restart --migrate --wait-workers`
- Jobs finish with the old database structure
- Database is updated
- New workers start with the new structure
- Consistency is maintained
- **Bad:** `fmx restart --migrate --no-wait-workers`
- Database changes while old workers are still running
- Old workers access data that no longer matches expectations
- Leads to errors and corruption
## How to Choose
Here’s a simplified decision process:
**Is your system completely broken?**
→ Use `fmx restart` for quick recovery
**Are critical jobs running that must finish?**
→ Use `fmx restart --wait-workers`
**Is this a database migration?**
→ Use `fmx restart --migrate --wait-workers` (do not skip this)
**Is this production and you want safety?**
→ Use `fmx restart --wait-workers`
**Is this development and you want speed?**
→ Use `fmx restart`
**Need a balance between speed and safety?**
→ Use `fmx restart --no-wait-workers`
## Common Scenarios
**Deploying new code to production:**
- No database changes: `fmx restart --no-wait-workers`
- With database changes: `fmx restart --migrate --wait-workers`
**Developing and restarting frequently:**
- Use `fmx restart` for speed
**Something’s broken and users are complaining:**
- If system is down: `fmx restart` (quick fix)
- If system is unstable: `fmx restart --wait-workers` (protect running jobs)
**Need to restart but a big report is running:**
- Use `fmx restart --wait-workers` and take a break
## Useful Options
- `--wait-workers-timeout 300`: Set a maximum wait time (default: 5 minutes)
- `--migrate-timeout 600`: Extend time for migrations if needed
- `--wait-workers-verbose`: See worker activity while waiting
- `--force-kill-timeout 30`: Force kill processes after 30 seconds
## When Things Go Wrong
**Workers won’t stop:**
- Check `fmx status -v` for stuck processes
- Review Background Jobs in the web interface
- Increase the timeout or use `--force-kill-timeout`
**RQ suspension fails:**
- Check your Redis connection in `common_site_config.json`
- Ensure Redis is running
**Services won’t start after restart:**
- View logs with `fmx logs [service_name] --tail 100`
The `fmx restart` command is powerful—choose wisely to keep users happy and data safe.