A backup job in WHM that sits at "In Progress" for six, twelve, or even twenty-four hours is one of the most stressful failure modes a cPanel/WHM administrator can face. Unlike a clean failure with an error code, a stuck backup gives you nothing to go on — no crash log, no timeout message, just a spinning status and a growing sense that something in the queue has silently frozen. Underneath, the culprit is almost always a hung pkgacct process (or its compression child process) that stopped making progress but never exited, blocking the entire backup queue behind it and quietly eating disk I/O, CPU, and sometimes inodes along the way.
This guide walks through exactly how to confirm a backup job is actually stuck (not just slow), how to safely terminate the hung process without corrupting other data, how to clean up the mess it leaves behind, and how to stop it from recurring. If you manage this server yourself, these are the same diagnostic steps a server management team would run before touching anything destructive.
Why cPanel/WHM Backup Jobs Get Stuck
WHM's backup system runs each account through pkgacct, which packages home directory files, mail, databases, and configuration into a single archive. Several things can cause this process to freeze mid-way rather than fail cleanly:
- A single oversized account. Multi-hundred-gigabyte home directories or mailboxes with millions of small Maildir files can make tar/rsync appear to hang for hours, even though it is technically still working — just extremely slowly.
- Disk I/O contention. If the backup destination is a slow network mount (NFS, SFTP, or a remote object store gateway) and the connection stalls, the writing process blocks indefinitely waiting on I/O.
- Corrupted or locked MySQL tables.
mysqldumpcan hang waiting on a table lock from another process, and pkgacct will wait for it to finish before continuing. - Filesystem errors or bad sectors. A failing disk can cause read operations to hang at the kernel level, which no amount of restarting cpanel services will fix.
- Leftover lock files from a previous failed run. If a prior backup was killed uncleanly, stale lock files in
/var/cpanel/backups/can cause the next scheduled run to wait forever on a resource that will never be released. - Zombie or orphaned child processes. Compression utilities (gzip, tar) spawned by pkgacct can become orphaned if the parent process is killed improperly, continuing to run without any way for WHM to track their completion.
💡 None of these worked? Skip the guesswork.
Get Expert Help →Step 1: Confirm the Job Is Actually Stuck, Not Just Slow
Before killing anything, verify the process is truly frozen rather than making slow progress on a legitimately huge account.
Look at /usr/local/cpanel/logs/cpbackup/ and note the file size and timestamp. If the archive size hasn't changed in 30-60 minutes, that's a strong signal of a genuine hang rather than a slow transfer.
ls -la /usr/local/cpanel/logs/cpbackup/
watch -n 30 'ls -la /home/*/backup-*.tar.gz 2>/dev/null'
Use ps to find any active pkgacct, cpbackup, or compression processes and how long they've been running.
ps aux | grep -E '(cpbackup|pkgacct|dumper)' | grep -v grep
A process that's genuinely working will show non-zero CPU or disk activity in top or iotop. A process pinned at 0% CPU with a status of D (uninterruptible sleep) in ps output is waiting on I/O that may never complete — often a sign of a failing disk or an unresponsive remote mount.
top -p $(pgrep -f pkgacct | tr '\n' ',' | sed 's/,$//')
ps -eo pid,stat,etime,cmd | grep pkgacct
In WHM, go to Backup → Backup Restoration or Backup Configuration → Additional Destinations and look for an option to cancel the running job. This is the safest first attempt because it lets cPanel's own cleanup routines run.
If WHM's UI can't cancel it (common when the process is truly frozen), send SIGTERM before resorting to SIGKILL:
kill $(pgrep -f pkgacct)
sleep 10
ps aux | grep pkgacct | grep -v grep
If the process ignores SIGTERM after a reasonable wait, use SIGKILL as a last resort. Be aware this skips cleanup routines and can leave partial archives and lock files behind — which is expected, and addressed in the next step.
kill -9 $(pgrep -f pkgacct)
killall -9 cpbackup 2>/dev/null
ls -la /var/cpanel/backups/*.lock
rm -f /var/cpanel/backups/*.lock
Partial tar.gz files from the killed job will not be valid and should be removed before the next run, otherwise they can be picked up mistakenly or simply waste disk space.
find /backup -name "*.tar.gz" -size -1M -mmin +60 -exec ls -la {} \;
find /backup -name "*.tar.gz.partial" -delete
If mysqldump was part of the hang, check for long-running or sleeping queries left behind and kill them individually if necessary.
mysqladmin processlist | grep -i "backup\|dump"
mysqladmin kill <process_id>
Hung backups are a common cause of runaway disk and inode consumption, since partial files and temp directories accumulate silently.
df -h
df -i
Step 4: Prevent It From Happening Again
Once the immediate fire is out, the real value is in stopping this from recurring on the next scheduled backup window.
- Exclude oversized accounts from full backups in WHM → Backup Configuration, and back them up separately with more generous time windows or dedicated incremental jobs.
- Switch to incremental backups where possible so each run only processes changed files instead of re-packaging entire home directories every time.
- Stagger backup start times across accounts and cron windows so I/O and CPU load isn't concentrated into a single spike that starves the backup process of resources.
- Monitor remote destination health (SFTP, S3-compatible endpoints, NFS mounts) independently of the backup job itself, since a stalled network mount is one of the most common root causes of a "stuck" job that has nothing to do with cPanel at all.
- Set up alerting on backup duration so you're notified automatically if a job runs significantly longer than its historical average, rather than discovering it 12 hours later during a routine check.
- Run smart-monitoring on disk health (
smartctl) periodically, since failing drives frequently manifest first as backup jobs that mysteriously hang rather than as outright disk errors.
If backup reliability keeps causing production risk on your server, it's often more efficient to have this monitored and maintained proactively rather than reactively firefighting each incident. CloudHouse's server management service includes backup health monitoring, alerting, and hands-on remediation so a frozen pkgacct process gets caught and resolved before it becomes a multi-hour outage.
When to Escalate Beyond a Simple Kill-and-Cleanup
Not every stuck backup is resolved by killing the process and clearing lock files. Escalate to deeper diagnostics if:
- The same account causes a hang on every backup attempt, even after excluding it and retrying in isolation — this points to filesystem-level corruption on that account's data.
dmesgshows I/O errors or SCSI/ATA errors around the time of the hang, which strongly suggests failing physical storage rather than a software issue.- Multiple unrelated processes besides the backup job are also getting stuck in
Dstate, indicating a systemic storage or kernel-level I/O problem rather than something specific to pkgacct. - The backup destination is remote and you cannot rule out network-layer packet loss or authentication timeouts contributing to the stall.
In these cases, treat it as an infrastructure health issue rather than a one-off backup glitch, and involve deeper server diagnostics (disk SMART data, network path testing, kernel logs) before simply re-running the backup and hoping it completes.
Conclusion
A frozen cPanel/WHM backup job is rarely a mystery once you know where to look: confirm it's genuinely stuck rather than slow, identify and gracefully terminate the hung pkgacct process, clean up the lock files and partial archives it leaves behind, and then address the underlying cause — oversized accounts, unreliable remote destinations, or failing storage — so it doesn't happen again on the next scheduled run. Treating backup reliability as an ongoing maintenance task rather than a one-time fix is what keeps a single hung process from turning into a missed backup window right when you need a restore point most.
